空闲循环处理

许多应用程序执行冗长的处理 “在后台”。有时性能注意事项指定使用多线程为此类工作。 线程需要额外的开发系统开销,因此,它们没有为与空闲时间工作的简单任务建议使用 MFC 在 OnIdle 函数执行。 本文介绍空闲处理。 有关多线程处理的更多信息,请参见 多线程处理主题

后台处理正确完成间隔内用户与应用程序未以其他方式交互。 在所开发的应用程序对 Microsoft Windows 操作系统,应用程序可以执行处理通过拆分的空闲时间长时间处理。许多小型的片段。 使用 PeekMessage 循环,在处理每个片段之后,将使应用程序执行控制到窗口。

本文说明两种方式执行闲置处理在您的应用程序:

  • 使用 MFC 中的主消息循环的 PeekMessage

  • 嵌入另一个 PeekMessage 循环其他位置在应用程序。

在 MFC 消息循环的 PeekMessage

在应用程序开发与 MFC,在 CWinThread 类的主消息循环包含调用 PeekMessage Win32 API 的消息循环。 此循环也称为 CWinThreadOnIdle 成员函数在消息之间的。 应用程序可以通过重写 OnIdle 功能处理此空闲时间的消息。

备注

运行OnIdle和某些其他成员函数现在是类 CWinThread 的成员 (而不是类 CWinAppCWinApp 是从 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 文件的源代码在 Visual C++ 安装的 \ atlmfc \ src \ MFC 内容。

一次内层循环结束,外层循环执行闲置处理与一个或多个调用。 OnIdle。 第一次调用是 MFC 的用途。 可以使其他调用 OnIdle 为您执行后台工作。

有关执行闲置处理的更多信息,请在 MFC 库参考 OnIdle 引用。

请参见

概念

泛型MFC主题