【问题标题】:How to pass numerous arguments to a BackgroundWorker in c++如何在 C++ 中将大量参数传递给 BackgroundWorker
【发布时间】:2011-03-20 04:14:23
【问题描述】:

我在 C# 和 VB 中看到过这样的例子,但我真的受限于 c++,我试图将 20 个字符串传递给后台工作人员,以便它可以对它们执行任务。我已经尝试传递 windows 窗体对象,但它不能从 System::Object 转换回窗体而不会导致编译器错误。

我也尝试过通过 DoWork 方法传递一个包含字符串的对象,但这也不起作用。

任何帮助将不胜感激。谢谢你

【问题讨论】:

  • 您能否详细说明为什么包含对象的字符串不起作用?

标签: c++ windows visual-studio-2008 backgroundworker


【解决方案1】:

对于大量的字符串(或更一般地,“任务”),您可以使用同步队列、无锁队列,或者作为最简单的解决方案,使用完成端口。完成端口非常高效,如果您要安排的任务不超过几万个,那么真的不值得考虑更复杂的解决方案。

对于只有 20 个任务,这通常是多余的(除非每个任务运行很长时间),将所有内容放入一个对象并传递一个指向该对象的指针是最好的解决方案。否则,通信/同步开销将超过多线程带来的收益。

将指向结构的指针传递给工作线程在 C++ 中应该可以正常工作(我一直在这样做)。究竟是什么问题?

【讨论】:

  • 我尝试过使用结构并传递一个指向它的指针,但是,在头文件中定义结构时,我总是收到编译错误错误 C3265: cannot declare a managed 'length' in非托管“数据”不能声明全局或静态变量,或引用 gc 堆中对象的本机类型成员 using namespace System; struct data { static String^ length; static String^ width; };
  • 嗯...您说您受限于 C++,并将您的问题也标记为“C++”。这是您发布的 C# 代码,我很惊讶它没有给出更多错误。尝试类似 struct data { std::string* a;标准::字符串 b; };并将 data* 传递给您的线程函数。
  • 好的,所以它仍然坏了,除了将系统字符串转换为 char 数组的痛苦之外,编译器仍然抱怨无法从 System::Object 进行转换^ data *passvars; passvars->a = (const char*) (Marshal::StringToHGlobalAnsi(Form1::moduleLength->Text).ToPointer()); passvars->b = (const char*) (Marshal::StringToHGlobalAnsi(Form1::moduleWidth->Text).ToPointer()); backgroundWorker1->RunWorkerAsync( passvars );
  • 你似乎还是把事情搞混了。例如,在 C++ 中,没有关于您尝试使用 Object^ 做什么的概念。运算符^ 的意思是“异或”,所以上面的行没有意义。类型和变量之间没有异或之类的东西。你需要类似的东西: struct data { const char* a; /* 加上任何其他字段 / };数据 *p = 新数据; p->a = (const char) (... /* 不管*/); bgworker->RunWorkerAsync(p);请注意,像这样在 C++ 中使用 C 强制转换是不受欢迎的,还请注意,您必须记住释放内存(否则会泄漏)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多