许多应用程序执行的操作“在后台”。有时性能注意事项指定使用多线程处理。此类工作。 线程包括额外的开发系统开销,因此,它们不用于与空闲时间工作的简单任务建议 OnIdle MFC 在函数执行。 本文专门空闲处理。 有关多定向功能的更多信息,请参见以下主题 Multithreading Topics:
后台正确完成在此间隔内不否则用户与应用程序交互。 在开发的应用程序针对 Microsoft Windows 操作系统,再安装应用程序可执行处理通过拆分的空闲时间较长的过程到许多小型的片段。 在处理一段之后,应用程序某些执行控件为使用 PeekMessage 循环的窗口。
本文说明两种执行闲置的处理应用程序:
使用 MFC 中的主消息循环中的 PeekMessage。
嵌入其他 PeekMessage 循环在应用程序其他位置。
MFC 中的 PeekMessage 消息循环
在应用程序开发与 MFC,CWinThread 类的主消息循环包含调用 PeekMessage Win32 API 的消息循环。 此循环也称为 CWinThread 的 OnIdle 成员函数。消息之间的。 应用程序可以重写 OnIdle 函数处理本空闲时间的消息。
备注
运行、OnIdle和某些其他成员函数现在是类 CWinThread 的成员而不是 CWinApp类。CWinApp 是从 CWinThread 中派生的。
有关执行处理的更多信息,请参见" MFC 参考"中的OnIdle。
在其他 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 directory of your Visual C ++ 安装中。
一次关闭内部循环,外部循环执行闲置处理的一个或多个调用 OnIdle。 第一次调用是为 MFC 的用途。 可以进行的其他调用 OnIdle 执行自己后台工作。
有关执行处理的更多信息,请参见" MFC 参考"中的OnIdle。