MFC中多线程总结
前言
对于写MFC界面来说,如果某个消息映射函数流程执行时间太长,有太多的Sleep()和 While(1)会导致线程时间过长,MFC界面卡死,因此需要学会用多线程
思路
1. 创建流程
2. 创建线程调用的函数
3. 结束线程
第一步:创建线程
CWinThread *m_pThread; m_pThread=nullptr; m_pThread=AfxBeginThread(LoadNlpDict,this);//LoadNlpDict是调用的函数
第二步:线程调用的函数:
此函数必须是个静态或者是不属于该类的函数
UINT LoadNlpDict(LPVOID lpParam);
关于创建线程:
CWinThread *MyThread = AfxBeginThread(MyFunction,pParam,THREAD_PRIORITY_NORMAL,0,0,NULL); //MyThread是定义的线程指针 //MyFunction是调用函数 //pParam调用函数内LPVOID参数,作为传线程参数 //THREAD_PRIORITY_NORMAL是线程优先级,一般置0,和主线程一致 //第一个0代表和主线程一样的栈 //第二个0代表创建线程后就开始运行 //NULL和主线程一样安全
现成的等待,挂起与唤醒
MyThread->SuspendThread();//让线程等待! MyThread->ResumeThread();//唤醒暂停的线程!
查看线程状态
DWORD code; GetExitCodeThread(MyThread->m_hThread,&code); if(code==STILL_ACTIVE) { //线程仍在执行 } else { //线程停止执行 }
结束线程(强行结束)
TerminateThread(MyThread->m_hThread,0);
注意:线程函数可以放在cpp文件内
前加static变成全局函数(不一定放在C*****cpp中)
线程指针要放在界面类的protect中
CWinThread *mythread;
但线程函数可以单独拿出来
在头文件中声明
UNIT tetthread(LPVOID pParam)
在cpp文件内定义(不加static)
创建线程最好用:
AfxBeginThread(tetthread,this);
这样线程函数中pParam可以不为空指针