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