Есть несколько вещей, которые вы можете сделать.
(1) Вы можете пост диалоговое сообщение внутри CDialog :: OnInitDialog способом, а затем обработать длинную функцию обработчика сообщений этого опубликованное сообщение. Таким образом, сначала будет отображаться диалог, а затем длинная функция будет запущена.
(2) Второй вариант - убедиться, что цикл сообщения получает некоторое время обработки. Так что, если ваши длинные функции своего рода петля просто добавить случайный вызов к ProcessMessages, чтобы убедиться, что очередь сообщений хранятся пустой:
void ProcessMessages()
{
MSG msg;
CWinApp* pApp = AfxGetApp();
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
pApp->PumpMessage();
}
}
Edit: Это, конечно, можно использовать нити такой ситуация, но это не всегда без риска и сложности.
Использование потоков с GUI средства, имеющие дело с несколькими очередями сообщений, которые затем означает использование API, как PostThreadMessage и вводит новый набор вопросов, быть осторожными.
Для примера одного такого вопроса относится к этой ссылке:
http://msdn.microsoft.com/en-us/library/ms644946(VS.85).aspx
где говорит:
Сообщение, отправленное PostThreadMessage является не связан с окном. В качестве общего правила сообщения, которые не являются , связанные с окном, не могут быть , отправленные функцией DispatchMessage . Поэтому, если поток получателя находится в модальном цикле (как используется MessageBox или DialogBox), сообщения будут потеряны. Для перехвата сообщений потоков в модальном цикле используйте привязку к конкретному потоку.
Я использую подход сообщения процесса в Zeus IDE, и он очень хорошо работает, убедившись, что графический интерфейс остается чувствительным к пользователю. Это также имеет то преимущество, что его очень легко реализовать.
IMO Функция ProcessMessage() - способ добавить отзывчивость к приложению MFC. – Hapkido
Я бы тоже использовал параметр ProcessMessage;) – jussij
Я категорически не согласен. 1) Метод пользовательского интерфейса не должен выполнять много «другой» работы, проблемы должны быть разделены. 2) Простая рабочая нить может использоваться в большинстве этих ситуаций, не нужно использовать несколько насосов. Почему вы пытаетесь отпугнуть OP от потоков? –