MFC 中的多线程开发

毕业入坑,被要求做一个 PC 上的嵌入式设备模拟器,然而一点都不会,用了大学里实验课折腾过的古老的 MFC 来做,对于习惯了 Java PHP 这样的程序语言的我来说,真是坎坷重重。

说一下 MFC 中多线程的开发方式。这里说的多线程,官方叫做「辅助线程」,与之相对的是「用户界面线程」。「辅助线程」就是用来进行一些后台处理工作的线程,以显示时间为例。

创建线程的方式是:

AfxBeginThread(MyThreadProc, pNewObject);

其中 MyThreadProc 是一个控制函数,要求声明为 static 或全局。pNewObject 可以传 this,并在控制函数 MyThreadProc 中强制类型转换为对象指针:

CemulatorDlg * eml = (CemulatorDlg*)pParam;

其中 CemulatorDlg 是对话框类的名称。

这样就可以直接使用原对话框对象中的函数,如:

eml->ClearScreen();

具体而言,创建线程可以如下操作:

CWinThread* timeCountThread;
TimeCountThread = (CWinThread*) AfxBeginThread(TimeCount, this);

其中控制函数 TimeCount 为:

UINT TimeCount(LPVOID pParam)
{
while(1) {
CemulatorDlg * eml = (CemulatorDlg*)pParam;
MSG msg;
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
if(msg.message==WM_THREAD_STOP) {
eml->ClearScreen();
return 0;
}
else {
DispatchMessage(&msg);
}
}
}
return 0;
}

一般地,当返回值为 0 的时候,就认为该线程正常终止。否则,应返回相应的错误码。