Программирование на языке 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 &&

! : :P 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

}

Похожие статьи: , ,