我想顯示一個對話框來通知用戶應用程序正忙。爲了避免阻塞主線程,我想使用std ::線程來顯示對話框。請看下面的代碼:在std :: thread中打開MFC對話框
InProcDlg inProcess;
std::thread t([ &inProcess ] {
inProcess.DoModal();
delete inProcess;
});
// wait till process fished
::PostMessage(inProcess.m_hWnd, WM_USER + 1, 0, 0);
if (t.joinable()){
t.join();
}
InProcDlg.cpp
BEGIN_MESSAGE_MAP(InProcDlg, CDialogEx)
...
ON_MESSAGE(WM_USER + 1, &InProcDlg::close)
END_MESSAGE_MAP()
LRESULT InProcDlg::close(WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(wParam, lParam);
EndDialog(1);
return 0;
}
運行這段代碼正確所示的對話框。該對話框也關閉,但主對話框不顯示,應用程序掛起CreateRunDlgIndirect()
。試着介入,同時設置一些斷點,主對話框再次正確顯示。很奇怪。我會非常樂意提供任何建議,我必須深入研究。
在接下來的步驟中,我還想通過發送一個指示當前進程狀態的整數向用戶顯示進程。
int *percent;
::PostMessage(inProcess.m_hWnd, WM_USER + 2, 0, reinterpret_cast<LPARAM>(percent));
在發送或發佈消息之前,我如何獲得對話已存在的證據? 我使用Visual Studio 2013年
看一看:http://stackoverflow.com/questions/1669017/how-to-create- a-mfc-dialog-with-a-progress-bar-in-a-separate-thread – dwo
是否刪除inProcess;甚至編譯?無論如何,放棄它 - 這是沒有道理的。 –
反過來做它更好,通常也更容易 - 在主UI線程上顯示對話框,在工作線程上運行繁忙處理。 –