0

我正在开发一个程序,该程序需要我从另一个线程(而不是创建此 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,然后返回当前线程?

下面是一些截图: Scr1 Scr2 Scr3

我对 C++ 有一般的了解,对线程有一点了解。任何帮助将非常感激。

4

2 回答 2

1

答案取决于您使用的 Windowin 库。通常它们提供一个函数,该函数将函数指针作为参数,将在主 UI 线程上运行。

这是相当常见的操作,“[windows framework] update ui thread”的快速谷歌应该会产生结果。

编辑:

好的,在winforms中你需要一个代表。委托是普通 c++ 中函数指针的等价物。那么你需要从 UI 线程调用它。

我建议你看看这个问题。基本上,您要求您的表格为InvokeRequired. 这会询问表单“如果我尝试修改你,你会抛出对我无效的跨线程操作吗?”。如果是真的,那么你BeginInvoke从 UI 线程创建委托和它。否则修改它是安全的。

于 2013-06-04T21:58:26.647 回答
0

您可以尝试将 Windows 消息发布到窗口。

PostMessage((HWND)rMainGUI->textBox3->Handle.ToPointer(), WM_SETTEXT, 0, (LPARAM)L"TestDLL Try");

不确定 Windows 窗体控件的响应是否与旧控件相同,但值得一试。

于 2013-06-04T22:11:34.237 回答