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

用户界面线程通常用于处理用户输入和响应用户事件,这些行为独立于执行该应用程序其他部分的线程。 已经创建并启动主应用程序线程(在 CWinApp 导出的类中提供)。 本文描述创建其他用户界面线程所需的步骤。

创建用户界面线程时,必须首先从 CWinThread 派生类。 必须使用 DECLARE_DYNCREATEIMPLEMENT_DYNCREATE 宏声明并实现此类。 此类必须重写某些函数,也可以重写其他函数。 下表列出了这些函数及其用途。

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

函数

用途

ExitInstance

线程终止时执行清除。 通常重写。

InitInstance

执行线程实例初始化。 必须重写。

OnIdle

执行线程特定的闲置时间处理。 通常不重写。

PreTranslateMessage

将消息调度到 TranslateMessageDispatchMessage 之前对其进行筛选。 通常不重写。

ProcessWndProcException

截获由线程的消息和命令处理程序引发的未经处理的异常。 通常不重写。

Run

控制线程的函数。 包含消息泵。 一般不重写。

MFC 通过参数重载提供两个版本的 AfxBeginThread:一个用于用户界面线程,另一个用于辅助线程。 若要启动用户界面线程,请调用 AfxBeginThread,提供下列信息:

  • CWinThread 派生的类的 RUNTIME_CLASS

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

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

  • (可选)CREATE_SUSPENDED,如果希望在挂起状态中创建线程。 默认值为 0,即正常启动线程。

  • (可选)所需的安全特性。 默认值与父线程具有相同的访问权。 有关此安全信息格式的更多信息,请参见 Windows SDK 中的 SECURITY_ATTRIBUTES

AfxBeginThread 为您完成大部分工作。 它创建类的新对象、使用您提供的信息初始化该对象并调用 CWinThread::CreateThread 开始执行线程。 在整个过程中进行检查,确保假如创建过程的任何部分出现故障,所有对象都能被正确地解除分配。

您想进一步了解什么?

请参见

概念

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