

Программирование на языке MFC
Мой второй блог в серии программирования
Метод CWinApp:Run
Запускаем программу на выполнение… Что такое? Программа «зависла»… Да нет, программа не «зависла». Вспомните, уважаемый читатель, что после метода lnitlnstance() немедленно вызывается метод CWinApp::Run(). Именно в нем программа и «циклит»! Придется опять искать причину неправильной работы программы. Что же может случиться? Мы создали объект класса CWnd, записали указатель на него в поле m_pMainWnd, чего же еще? Взглянув на исходный код метода CWinApp::Run(), можно с уверенностью сказать, что причину «зацикливания» нужно искать в методе CWinThread::Run(). Его исходный текст находится в файле thrdcore.cpp:
int CWinThread::Run() {
ASSERT_VALID(this);
// for tracking the idle time state BOOL bldle = TRUE; LONG HdleCount = 0;
// acquire and dispatch messages until a WM_QUIT message is received, for (;;) {
// phasel: check to see if we can do idle work while (bldle &&
! :
eekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE)) {
// call Onldle while in bldle state
if (!0nldle (HdleCount++) )
bldle = FALSE; // assume "no idle" state
}
// phase2: pump messages while available
do
{
// pump message, but quit on WM_QUIT if (!PumpMessage())
return Exitlnstance ();
// reset "no idle" state after pumping "normal" message if (IsIdleMessage(&m_msgCur)) {
bldle = TRUE; HdleCount = 0;
}
} while (::PeekMessage(&m_msgCur,
NULL, NULL, NULL,
PM_NOREMOVE));
}
ASSERT(FALSE); // not reachable
}
Похожие статьи: CWinApp, lnitlnstance, Метод CWinApp
