Я хотел бы показать диалоговое окно, информирующее пользователя о том, что приложение занято. Чтобы избежать блокировки основного потока, я думал использовать std :: thread, чтобы показать диалог. Рассмотрим следующий код:Откройте диалог MFC в std :: thread
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
Выполняет ли 'delete inProcess'' даже компиляцию? В любом случае, опустите его - это не имеет смысла. –
Лучше, и обычно проще, сделать это наоборот - показать диалог в главном потоке пользовательского интерфейса, запустить занятую обработку в рабочем потоке. –