Шаг 286 - Где цикл обработки сообщений в MFC ?

Основу любой программы для Windows составляет цикл обработки сообщений. Этот цикл есть у каждой программы для Windows. В MFC у нас есть главный объект CWinApp. Именно он запускает цикл обработки сообщений с помощью функции RUN. Только эта функция определена в классе CWinTread, наследником которого является CWinApp. Вот ее реализация:

int CWinThread::Run()
{
	ASSERT_VALID(this);

	// переменные для слежения за состоянием
	BOOL bIdle = TRUE;
	LONG lIdleCount = 0;

	// обрабатываем пока не встретим WM_QUIT
	for (;;)
	{
		// можно ли работать в период ожидания
		while (bIdle &&
			!::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE))
		{
			// Вызываем OnIdle, если переменная установлена
			if (!OnIdle(lIdleCount++))
				bIdle = FALSE; // нет ожидания
		}

		// получаем сообщения пока возможно
		do
		{
			// Проверяем на WM_QUIT
			if (!PumpMessage())
				return ExitInstance();

			// сброс, если сообщение нормальное
			if (IsIdleMessage(&m_msgCur))
			{
				bIdle = TRUE;
				lIdleCount = 0;
			}

		} while (::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE));
	}
	ASSERT(FALSE);  // здесь мы никогда не должны оказаться
}

Сообщения выбирает функция PeekMessage(). Эта функция очень похожа на GetMessage(). Только главное отличие, что GetMessage() переводит поток в состояние ожидания сообщения, а PeekMessage() возвращает значение NULL. Использование PeekMessage() позволяет проводить фоновые задачи до поступления сообщения. Если сообщений нет, то как видите вызывается функция OnIdle(). Эта функция выполняет всякие фоновые задачи, например, обновляет интерфейс, очищает структуры данных и т.д. Вы можете ее переопределить в CWinApp и нагрузить своими задачами.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 15.11.2000