多线程处理:创建 MFC 用户界面线程

用户界面线程通常用于处理用户输入和响应用户事件,独立于执行应用程序其他部分的线程。 已为你创建并启动主应用程序线程(在 CWinApp 派生类中提供)。 本主题介绍创建其他用户界面线程所需的步骤。

创建用户界面线程时必须做的第一件事是从 CWinThread 派生类。 必须使用 DECLARE_DYNCREATEIMPLEMENT_DYNCREATE 宏声明和实现此类。 此类必须重写某些函数,也可以重写其他函数。 下表显示了这些函数及其应执行的操作。

创建用户界面线程时要重写的函数

功能 目的
ExitInstance 线程终止时执行清理。 通常会被重写。
InitInstance 执行线程实例初始化。 必须被重写。
OnIdle 执行特定于线程的空闲时间处理。 通常不会被重写。
PreTranslateMessage 在将消息调度到 TranslateMessageDispatchMessage 之前对其进行筛选。 通常不会被重写。
ProcessWndProcException 截获由线程的消息和命令处理程序引发的未经处理的异常。 通常不会被重写。
运行 控制线程的函数。 包含消息泵。 很少被重写。

MFC 通过参数重载提供两个版本的 AfxBeginThread:一个只能创建辅助线程,另一个既可创建用户界面线程也可创建辅助线程。 若要启动用户界面线程,请调用 AfxBeginThread 的第二个重载,并提供下列信息:

  • 派生自 CWinThread 的类的 RUNTIME_CLASS

  • (可选)所需优先级级别。 默认为正常优先级。 有关可用优先级级别的详细信息,请参阅 Windows SDK 中的 SetThreadPriority

  • (可选)所需的线程堆栈大小。 默认为与创建线程时相同的堆栈大小。

  • (可选)CREATE_SUSPENDED,如果希望线程在挂起状态下创建的话。 默认为 0,否则正常启动线程。

  • (可选)所需的安全属性。 默认为与父线程具有相同的访问使用情况。 有关此安全信息格式的详细信息,请参阅 Windows SDK 中的 SECURITY_ATTRIBUTES

AfxBeginThread 为你执行大部分工作。 它会创建类的新对象,使用你提供的信息初始化它,并调用 CWinThread::CreateThread 以开始执行线程。 在整个过程中都会进行检查,以确保在创建的任何部分失败时正确解除分配所有对象。

你想进一步了解什么?

另请参阅

使用 C++ 和 MFC 进行多线程编程