我正在开发一个程序,它要求我从另一个线程(而不是创建此GUI的主线程)更新我的Windows窗体GUI。我尝试使用:
rMainGUI->textBox3->Text = "TestDLL Try";
rMainGUI->textBox3->Update();
但该计划刚刚陷入第一线。 如果我删除第一行,它会在运行时给出一个错误,说:
"Cross-thread operation not valid: Control 'textBox3' accessed from a thread other than the thread it was created on."
我想知道是否有一些简单的线程安全UI更新功能,我可以使用它来更新GUI而不会搞乱这些线程?或者,如果有一些命令我可以用来暂停当前线程,转到主线程,更新GUI然后返回当前线程?
我对C ++有一般的了解,对线程有一点了解。 任何帮助将不胜感激。
答案 0 :(得分:1)
答案取决于您使用的Windowin库。通常它们提供一个函数,它将函数指针作为将在主UI线程上运行的参数。
这是相当常见的操作,快速谷歌“[windows framework]更新ui线程”应该会产生结果。
编辑:
好的,在winforms中你需要一个代表。委托是常规c ++中函数指针的等效值。那么你需要从UI线程调用它。
我建议你看看this question。基本上,您要求表单InvokeRequired
。这会询问“如果我试图修改你,你会不会对我进行跨线程操作?”。如果是,则从UI线程创建委托和BeginInvoke
。否则可以安全地修改它。
答案 1 :(得分:0)
您可以尝试将Windows消息发布到窗口。
PostMessage((HWND)rMainGUI->textBox3->Handle.ToPointer(), WM_SETTEXT, 0, (LPARAM)L"TestDLL Try");
不确定Windows窗体控件是否与旧版控件响应相同,但值得一试。