我的同事和我有争议.我们正在编写一个处理海量数据的.NET应用程序.它接收数据元素,根据某些标准将它们的子集分成块,并处理这些块.
假设我们有类型的数据项Foo
逐个到达某些来源(例如,来自网络).我们希望收集子集类型的相关对象Foo
,构造类型的对象Bar
从类型的每个这样的子集和处理的对象Bar
.
我们其中一个人提出了以下设计.它的主题是IObservable<T>
直接从我们组件的接口公开对象.
// ********* Interfaces **********
interface IFooSource
{
// this is the event-stream of objects of type Foo
IObservable<Foo> FooArrivals { get; }
}
interface IBarSource
{
// this is the event-stream of objects of type Bar
IObservable<Bar> BarArrivals { get; }
}
/ ********* Implementations *********
class FooSource : IFooSource
{
// Here we put logic that receives Foo objects from the network and publishes …
Run Code Online (Sandbox Code Playgroud) 当我将表达式编译成可执行代码并获得委托时 - 当不再存在对该委托的引用时,代码是否会被垃圾收集?
有没有这方面的文件?因为我在MSDN中找不到任何有用的东西.
我有一个带有库项目的Visual Studio解决方案让我们调用它libFoo
,还有一个可执行项目 - 让我们调用它Bar
依赖于它libFoo
.
例如,当我改变libFoo/bar.cpp
并尝试构建时,libFoo
Visual Studio会编译我的bar.cpp文件,但不会重新生成库libFoo.lib
,说它已经是最新的.
我检查了系统时钟.我还验证了bar.obj
文件的修改时间实际更新,并且库比obj更旧.但它仍然没有重新创建库.
实际的解决方案实际上包含大约100个项目,其中一些是库,其中一些是可执行文件.问题发生在我的3名团队成员的计算机上.其余的不受影响.我们不知道它为什么会发生,以及如何解决它......或者天气可能会发生在其他团队成员身上.
我无法通过使用库和依赖于它的可执行文件创建自己的小型解决方案来重新生成它.所以我认为这是环境问题和我们的解决方案/项目文件问题的某种组合.
谢谢,亚历克斯.
编辑
该解决方案是在Visual Studio 2010上创建的,并且在VS2010上开发了多年,直到我们开始使用VS2012.对于同时安装了VS2010和VS2012的用户,会出现问题.该解决方案现在是VS2012解决方案,项目使用VS2010平台工具包.
当我们开始使用VS2012时,我们的团队迁移了解决方案,但我们将所有C++项目的"平台工具包"保留为VS2010,以允许我们的代码与仍使用VS2010的其他团队兼容.
谷歌没有透露任何合理的解决方案.虽然它确实揭示了其他人也遇到类似问题的事实.
在C++ 11中,我们在某些情况下被指导为按值传递对象,在其他情况下通过const-reference传递对象.但是,本指南取决于方法的实现,而不仅仅取决于其接口和客户的预期用途.
当我编写一个接口时,我不知道它将如何实现.写方法签名有一个很好的经验法则吗?例如 - 在下面的代码片段中,我应该使用Bar1
或Bar2
?
class IFoo
{
public:
virtual void Bar1(std::string s) = 0;
virtual void Bar2(const std::string& s) = 0;
};
Run Code Online (Sandbox Code Playgroud)
如果您同意正确的签名取决于实施,您可以在此处停止阅读.这是一个例子,说明我相信的原因.
在以下示例中,我们应该按值传递字符串:
class Foo
{
std::string bar;
Foo(std::string byValue)
: bar(std::move(byValue))
{
}
};
Run Code Online (Sandbox Code Playgroud)
现在我们可以在所有情况下以有效的方式实例化Foo:
Foo foo1("Hello world"); // create once, move once
Foo foo2(s); // the programmer wants to copy s. One copy and one move
Foo foo3(std::move(t)); // the programmer does not need t anymore. No copy at all …
Run Code Online (Sandbox Code Playgroud) 我在Windows上使用C++中的Apache thrift,我想请求您帮助取消正在进行的阻塞读取操作.读取操作(例如 - TProtocol :: readByte)将被阻止,直到收到数据.当我从另一个线程关闭传输时,我得到一个关于空指针的失败断言.
有没有其他方法可以取消阻止的读取操作?
我有一个以行主顺序存储的矩阵.我正在尝试使用FFTW计算ub矩阵的DCT,我得到了无意义.在下面的段落中,我将描述问题和我的解决方案,我希望你帮助理解为什么它不起作用.
鉴于一些i
和l
,我想计算一个子矩阵包括所有行的DCT k
为此k mod l == i
.例如,假设l = 3
和i = 2
.在下面的矩阵中,我希望变换的子矩阵用红色标记(2 mod 3 = 2,5 mod 3 = 2,8 mod 3 = 2).
源和目标数组具有相同的布局,转换后的矩阵应存储在目标数组中的相同位置.
void transform(double* src, double* dest, size_t rows, size_t cols, size_t l, size_t i)
{
int rank = 2;
fftw_iodim64 dims[] = {
{ rows / l, l, l },
{ cols, rows, rows } };
fftw_r2r_kind kind = FFTW_REDFT10;
fftw_plan plan = fftw_plan_guru64_r2r(rank, dims, 0, …
Run Code Online (Sandbox Code Playgroud) 编写SomeCommand | { ... }
将全部输出通过管道SomeCommand
传递到花括号中的代码。有没有一种方法可以一次“管道传输”一行,并让大括号中的代码逐行处理,而不必等待整个输出都存储在内存中?
更新资料
[从评论中复制]
SomeCommand
是可执行文件(不是powershell cmdlet),在运行时会产生一些输出。它产生的各行之间需要花费一些时间,我不想等到所有行都产生后才对每一行执行一些操作
我正在尝试编写一个自定义std::ostream
,为每个写入它的行调用一个函数.也就是说,我希望以下代码能够按照注释中的说明进行操作:
my_output_stream s([] (const std::string& line) {
WriteLineToSomeOutput(line);
});
s << "Hello world"; // do not invoke anything. The line has not ended yet!
s << ", from Alex" << std::endl; // here we invoke WriteLineToSomeOutput("hello world, from Alex")
s << "What's up"; // do not invoke anything. The line has not ended yet.
s << ", doc?!\nHow u doing?\n"; // Now we have two lines. We invoke WriteLineToSomeOutput("What's up, doc?!) and WriteLineToSomeOutput("How u doing?")
Run Code Online (Sandbox Code Playgroud)
请注意,数据不会写入任何地方,也不会存储在任何地方.我需要存储流的唯一内容是当前正在聚合的行,直到我们遇到行结束.
即使使用boost.Iostreams库,我也没有找到任何简单的方法.我可以通过使用STL和Boost的一些内置工具来避免在这里编写自己的行标记器吗?
背景 …
我有一个应用程序,其中包含驻留在Viewport3D中的3D对象,我希望用户能够通过拖动屏幕上的矩形来选择它们.
我尝试在Viewport3D上应用GeometryHitTestParameters(带有矩形几何)以获得结果,但是我得到一个异常,告诉我它与Viewport3D不相关.仅支持PointHitTestParameters.
有没有人知道任何优雅的方法,除了自己计算(例如 - 将所有3D对象投影到2D并使用矩形进行手动几何交叉)?