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可以不为空指针

相关