不知道大家在 MFC 编程时有没有遇到过这样一个问题,当一个程序用到比较复杂的计算或者仅仅就是触发一个死循环,整个画面就卡死在那里不动了?这是因为程序一直在执行着该计算,根本无暇对其他的消息做出响应,这样导致的结果是用户体验非常差,而且程序效率十分低下。多线程可以帮助我们解决这个问题,其原理是操作系统分出不同线程对应的时间片,当一个线程执行到一定的时间后程序切换到另外的线程去执行该线程的程序,这样反复快速的切换,让用户有种多条线程同时在跑的感觉。
MFC中有两类线程,一为工作者线程、一为用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。由于本人只使用过工作者线程,是故暂时只做工作者线程相关的记录。下面为跑起线程的代码:
在程序对话框类定义中(添加为全局函数也可以)添加如下三个函数:
private: //多线程 void RunThread(); static UINT ThreadFun(LPVOID lpParam); void ThreadRun();
在cpp文件中分别对三个函数进行定义
void CMFC_TESTDlg::RunThread() { CWinThread* pThread;//线程指针对象 pThread = AfxBeginThread(ThreadFun, (void *)this);//开启一个工作者线程,ThreadFun为线程的入口函数 }
UINT CMFC_TESTDlg::ThreadFun(LPVOID lpParam) { CMFC_TESTDlg *dlg = (CMFC_TESTDlg *)lpParam; dlg->ThreadRun();//调用线程的响应函数,其实如果愿意,也可以忽略掉这两句话,直接将多线程的处理内容加在这里,这样做是为了让多线程的调用层次看起来更加的明显 return 0; }
void CMFC_TESTDlg::ThreadRun() { //线程处理函数主体部分,将要该线程需要处理的代码添加在这个位置 }定义完上面三个函数之后,工作线程的声明和定义工作就已经完成了,可以在程序中想要启用多线程的地方调用 RunThread() 让线程跑起来。