我在一个单独的线程中运行了一个无模式对话框。我想从我的主程序更新此对话框。我尝试创建自定义消息UPDATE = 0x8001(在此范围内WM_APP - 0xBFFF)和该消息的关联处理程序并调用postthreadmessage()。但这不起作用。我的代码看起来像这样。
int _tmain(int argc, _TCHAR* argv[])
{
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), SW_SHOW))
{
std::cout<<"Fatal Error: MFC initialization failed\n";
}
else
{
std::thread th2(ModelessThreadFunc);
DWORD thid = GetThreadId(th2.native_handle());
std::cout<<PostThreadMessage(thid,UPDATE,0,0);
th2.join();
}
return 0;
}
int ModelessThreadFunc()
{
dialog *dial = new dialog;
assert(dial->Create(dialog::IDD));
dial->ShowWindow(SW_SHOWNORMAL);
MSG msg;
while((::GetMessage(&msg, NULL, 0,0) != 0))
{
::peekmessage(&msg,NULL,0x8000,0x8002,0x0001);
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
return 0;
}
任何人都能解释上述逻辑的问题吗?我的目标是在其线程之外更新对话框。欢迎任何更多的想法。谢谢。
答案 0 :(得分:1)
如果目标线程创建任何窗口,则会记录PostThreadMessage失败。你应该PostMessage到对话框HWND。您可能还需要使用AfxBeginThread而不是std :: thread,因为您需要内置于CWinThread的MFC消息泵。
通常,不建议您采用的方法。所有GUI都应该在主线程中,而辅助线程用于耗时的操作。这避免了许多尴尬的问题。