Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从另一个线程和类C+;更新Winform控件+; 我一直在努力尝试从另一个线程和另一个C++类中更新WiFrm控件。我看到了几个关于这个主题的问题,但每个问题在某种程度上似乎都不完整,我无法找出缺失的部分_C++_Multithreading_Class_User Interface_Forward Declaration - Fatal编程技术网

从另一个线程和类C+;更新Winform控件+; 我一直在努力尝试从另一个线程和另一个C++类中更新WiFrm控件。我看到了几个关于这个主题的问题,但每个问题在某种程度上似乎都不完整,我无法找出缺失的部分

从另一个线程和类C+;更新Winform控件+; 我一直在努力尝试从另一个线程和另一个C++类中更新WiFrm控件。我看到了几个关于这个主题的问题,但每个问题在某种程度上似乎都不完整,我无法找出缺失的部分,c++,multithreading,class,user-interface,forward-declaration,C++,Multithreading,Class,User Interface,Forward Declaration,我的Winform线程有一个picturebox。我有一个单独的类,它运行在一个单独的线程上,该线程从网络摄像头捕获图像,并对其进行处理,然后我想在picturebox中的Winform线程上显示这些图像。我使用的是VS2010 SE C++。 我的代码如下: //CameraThread.h using namespace System; using namespace System::Windows; using namespace System::Windows::Forms; clas

我的Winform线程有一个picturebox。我有一个单独的类,它运行在一个单独的线程上,该线程从网络摄像头捕获图像,并对其进行处理,然后我想在picturebox中的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
    }
        }
}
//CameraThread.h
使用名称空间系统;
使用名称空间系统::Windows;
使用命名空间System::Windows::Forms;
类别表格1;
公共类CameraThread
{
私人:
Form1*frm1;//编译器不喜欢这一行
public:CameraThread(Form1*tfrm1){
frm1=tfrm1;
}
无效图片更新(无效){
试一试{
frm1->Invoke(Form1->UpdateBox());
}
抓住
{ };
}
//表格1.h
名称空间SV7{
使用名称空间系统;
使用名称空间System::ComponentModel;
使用名称空间系统::集合;
使用命名空间System::Windows::Forms;
使用名称空间System::Data;
使用名称空间系统::绘图;
/// 
///表格1摘要
/// 
public ref类Form1:public System::Windows::Forms::Form
{
public:delegate void UpdateDelegate(void);
公众:
表格1(无效){
//构造代码
}
void UpdateBox(void){
如果(此->RawImageBox->需要调用){
UpdateDelegate ^d=gcnew UpdateDelegate(此,&Form1::UpdateBox);
此->rawmagebox->调用(d);
}
否则{
//实际更新此->RawImageBox的代码
}
}
}

我的Form1类编译得很好。但是,CameraThread需要引用Form1.UpdateBox方法。当我编译上述代码时,我收到一个引用“const”的错误CameraThread绑定声明一个指向Form1的指针。我认为Form1的前向声明可以处理这个问题,但显然不能。我的问题似乎是每个使用单独的线程和类从GUI线程执行重要工作的人都会遇到的问题,所以我希望我的问题会引发一个可能是u我是一个比较新的多线程,我也不要求C++的巨大专业知识,所以我道歉如果这是愚蠢的。

你使用不同的类的事实并不重要。这只是你如何组织你的代码的方法。你可以把所有的东西放在一个类里,做10个类。等等。目标是逻辑的。仔细组织你的代码

您不能从任何不同的线程对UI线程中使用的对象/数据字段执行任何操作。这将不起作用。这显然是错误的。在工作线程的堆上分配数据,调用
PostMessage
,使用指向此数据的指针,在UI线程上拾取数据(直接以您的表单),处理并发布此数据


这就是它的组织方式。

谢谢。我知道不能直接从另一个线程更新控件。这就是上面代码中需要检查委托和调用的原因。现在的问题是,如何从另一个线程和类调用该方法?具体来说,我的语法有什么问题?我必须检查但我看到很多关于我尝试的方法的问题。