我一直在努力尝试从另一个线程和C ++中的另一个类更新Winform控件。我看到了关于这个主题的几个问题,但是每个问题在某些方面似乎都不完整,我无法找出缺失的部分。
我的Winform线程有一个图片框。我有一个单独的类在一个单独的线程上运行,该线程从网络摄像头捕获图像,处理它们,然后我想在图片框中的Winform线程上显示图像。我正在使用VS2010 SE C ++。
我的代码如下:
//CameraThread.h
using namespace System;
using namespace System::Windows;
using namespace System::Windows::Forms;
class Form1;
public class CameraThread
{
private:
Form1* frm1; // compiler does not like this line
public: CameraThread(Form1 *tfrm1) {
frm1 = tfrm1;
}
void PictureUpdater(void) {
try {
frm1->Invoke( Form1->UpdateBox() );
}
catch
{ };
}
//Form1.h
namespace SV7 {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// Summary for Form1
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public: delegate void UpdateDelegate(void);
public:
Form1(void) {
// constructor code
}
void UpdateBox(void) {
if (this->RawImageBox->InvokeRequired) {
UpdateDelegate^ d = gcnew UpdateDelegate(this,&Form1::UpdateBox);
this->RawImageBox->Invoke(d);
}
else {
// code that actually updates this->RawImageBox
}
}
}
我的Form1类编译得很好。但是,CameraThread需要引用Form1.UpdateBox方法。当我编译上面的代码时,我收到一个错误,指的是一个“const”,其中CameraThread绑定声明一个指向Form1的指针。我认为Form1的前向声明会处理,但显然不是。我的问题似乎是每个人都使用一个单独的线程和类从GUI线程做重大工作会遇到,所以我希望我的问题会提示一个可以被其他人用作模板的响应。我对多线程相对较新,也不是在C ++方面拥有巨大的专业知识,所以如果这是愚蠢的话我会道歉。
答案 0 :(得分:0)
您使用不同类的事实并不重要。这就是组织代码的方式。您可以将所有内容放在一个类中,创建10个类等。目标是在逻辑上组织您的代码。
您不能对来自任何其他线程的UI线程中使用的对象/数据字段执行任何操作。这不行。这是完全错误的。在工作线程上的堆上分配数据,使用指向此数据的指针调用PostMessage
,在UI线程上(直接在表单中)获取数据,处理并释放此数据。
这是应该如何组织的。