多线程处理:创建 MFC 用户界面线程
用户界面线程通常用于处理用户输入和响应用户事件,独立于执行应用程序其他部分的线程。 已为你创建并启动主应用程序线程(在 CWinApp
派生类中提供)。 本主题介绍创建其他用户界面线程所需的步骤。
创建用户界面线程时必须做的第一件事是从 CWinThread 派生类。 必须使用 DECLARE_DYNCREATE 和 IMPLEMENT_DYNCREATE 宏声明和实现此类。 此类必须重写某些函数,也可以重写其他函数。 下表显示了这些函数及其应执行的操作。
创建用户界面线程时要重写的函数
功能 | 目的 |
---|---|
ExitInstance | 线程终止时执行清理。 通常会被重写。 |
InitInstance | 执行线程实例初始化。 必须被重写。 |
OnIdle | 执行特定于线程的空闲时间处理。 通常不会被重写。 |
PreTranslateMessage | 在将消息调度到 TranslateMessage 和 DispatchMessage 之前对其进行筛选。 通常不会被重写。 |
ProcessWndProcException | 截获由线程的消息和命令处理程序引发的未经处理的异常。 通常不会被重写。 |
运行 | 控制线程的函数。 包含消息泵。 很少被重写。 |
MFC 通过参数重载提供两个版本的 AfxBeginThread
:一个只能创建辅助线程,另一个既可创建用户界面线程也可创建辅助线程。 若要启动用户界面线程,请调用 AfxBeginThread 的第二个重载,并提供下列信息:
派生自
CWinThread
的类的 RUNTIME_CLASS。(可选)所需优先级级别。 默认为正常优先级。 有关可用优先级级别的详细信息,请参阅 Windows SDK 中的 SetThreadPriority。
(可选)所需的线程堆栈大小。 默认为与创建线程时相同的堆栈大小。
(可选)CREATE_SUSPENDED,如果希望线程在挂起状态下创建的话。 默认为 0,否则正常启动线程。
(可选)所需的安全属性。 默认为与父线程具有相同的访问使用情况。 有关此安全信息格式的详细信息,请参阅 Windows SDK 中的 SECURITY_ATTRIBUTES。
AfxBeginThread
为你执行大部分工作。 它会创建类的新对象,使用你提供的信息初始化它,并调用 CWinThread::CreateThread 以开始执行线程。 在整个过程中都会进行检查,以确保在创建的任何部分失败时正确解除分配所有对象。