从另一个线程和类C+;更新Winform控件+; 我一直在努力尝试从另一个线程和另一个C++类中更新WiFrm控件。我看到了几个关于这个主题的问题,但每个问题在某种程度上似乎都不完整,我无法找出缺失的部分
我的Winform线程有一个picturebox。我有一个单独的类,它运行在一个单独的线程上,该线程从网络摄像头捕获图像,并对其进行处理,然后我想在picturebox中的Winform线程上显示这些图像。我使用的是VS2010 SE C++。 我的代码如下:从另一个线程和类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
//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线程上拾取数据(直接以您的表单),处理并发布此数据
这就是它的组织方式。谢谢。我知道不能直接从另一个线程更新控件。这就是上面代码中需要检查委托和调用的原因。现在的问题是,如何从另一个线程和类调用该方法?具体来说,我的语法有什么问题?我必须检查但我看到很多关于我尝试的方法的问题。