Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
Библиотека классов Microsoft Foundation (MFC) продолжает поддерживаться. Однако мы больше не добавляем функции или обновляем документацию.
Многие приложения выполняют длинную обработку "в фоновом режиме". Иногда рекомендации по повышению производительности определяют использование многопоточных операций для такой работы. Потоки включают дополнительные затраты на разработку, поэтому они не рекомендуются для простых задач, таких как обработка во время простоя, которую MFC выполняет в функции OnIdle. В этой статье основное внимание уделяется бездействующей обработке. Дополнительные сведения о многопоточности см. в темах о многопоточности.
Некоторые виды фоновой обработки выполняются соответствующим образом во время интервалов, которые пользователь не взаимодействует с приложением. В приложении, разработанном для операционной системы Microsoft Windows, приложение может выполнять обработку бездействия, разделив длительный процесс на множество небольших фрагментов. После обработки каждого фрагмента приложение получает управление выполнением в Windows с помощью цикла PeekMessage .
В этой статье объясняются два способа выполнения фоновой обработки в вашем приложении:
Использование PeekMessage в основном цикле сообщений MFC.
Внедрение другого цикла PeekMessage где-то еще в приложении.
PeekMessage в цикле сообщений MFC
В приложении, разработанном с помощью MFC, основной цикл сообщений в CWinThread классе содержит цикл сообщений, вызывающий API Win32 PeekMessage . Этот цикл также вызывает функцию-член OnIdleCWinThread между сообщениями. Приложение может обрабатывать сообщения в это время простоя, переопределяя функцию OnIdle .
Замечание
Run, OnIdleи некоторые другие функции-члены теперь являются членами класса CWinThread , а не класса CWinApp. Класс CWinApp является производным от CWinThread.
Дополнительные сведения о обработке режима ожидания см. в разделе OnIdle в справочнике по MFC.
PeekMessage в другом месте вашего приложения
Другой метод выполнения обработки бездействия в приложении заключается во внедрении цикла сообщений в одну из функций. Этот цикл сообщений очень похож на основной цикл сообщений MFC, найденный в CWinThread::Run. Это означает, что такой цикл в приложении, разработанном с помощью MFC, должен выполнять многие из таких же функций, что и основной цикл сообщений. В следующем фрагменте кода показано написание цикла сообщений, совместимого с MFC:
BOOL bDoingBackgroundProcessing = TRUE;
while (bDoingBackgroundProcessing)
{
MSG msg;
while (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if (!AfxGetApp()->PumpMessage())
{
bDoingBackgroundProcessing = FALSE;
::PostQuitMessage(0);
break;
}
}
// let MFC do its idle processing
LONG lIdle = 0;
while (AfxGetApp()->OnIdle(lIdle++))
;
// Perform some background processing here
// using another call to OnIdle
}
Этот код, внедренный в функцию, циклирует до тех пор, пока требуется неактивная обработка. В этом цикле вложенный цикл многократно вызывает PeekMessage. Если этот вызов возвращает ненулевое значение, цикл вызывает функцию CWinThread::PumpMessage для выполнения обычного перевода и отправки сообщений. Несмотря на PumpMessage то, что он не задокументирован, его исходный код можно проверить в файле ThrdCore.Cpp в каталоге \atlmfc\src\mfc установки Visual Studio.
После завершения внутреннего цикла внешний цикл выполняет неактивную обработку с одним или несколькими вызовами OnIdle. Первый вызов предназначен для целей системы MFC. Вы можете делать дополнительные вызовы к OnIdle, чтобы выполнять собственную фоновую работу.
Дополнительные сведения об обработке режима ожидания см. в разделе OnIdle в справочнике по библиотеке MFC.