MFC中多线程总结
前言
对于写MFC界面来说,如果某个消息映射函数流程执行时间太长,有太多的Sleep()和 While(1)会导致线程时间过长,MFC界面卡死,因此需要学会用多线程
思路
1. 创建流程
2. 创建线程调用的函数
3. 结束线程
第一步:创建线程
1 2 3 | CWinThread *m_pThread; m_pThread= nullptr ; m_pThread=AfxBeginThread(LoadNlpDict, this ); //LoadNlpDict是调用的函数 |
第二步:线程调用的函数:
此函数必须是个静态或者是不属于该类的函数
1 | UINT LoadNlpDict( LPVOID lpParam); |
关于创建线程:
1 2 3 4 5 6 7 8 | CWinThread *MyThread = AfxBeginThread(MyFunction,pParam,THREAD_PRIORITY_NORMAL,0,0,NULL); //MyThread是定义的线程指针 //MyFunction是调用函数 //pParam调用函数内LPVOID参数,作为传线程参数 //THREAD_PRIORITY_NORMAL是线程优先级,一般置0,和主线程一致 //第一个0代表和主线程一样的栈 //第二个0代表创建线程后就开始运行 //NULL和主线程一样安全 |
现成的等待,挂起与唤醒
1 2 | MyThread->SuspendThread(); //让线程等待! MyThread->ResumeThread(); //唤醒暂停的线程! |
查看线程状态
1 2 3 4 5 6 7 8 9 10 | DWORD code; GetExitCodeThread(MyThread->m_hThread,&code); if (code==STILL_ACTIVE) { //线程仍在执行 } else { //线程停止执行 } |
结束线程(强行结束)
1 | TerminateThread(MyThread->m_hThread,0); |
注意:线程函数可以放在cpp文件内
前加static变成全局函数(不一定放在C*****cpp中)
线程指针要放在界面类的protect中
CWinThread *mythread;
但线程函数可以单独拿出来
在头文件中声明
UNIT tetthread(LPVOID pParam)
在cpp文件内定义(不加static)
创建线程最好用:
1 | AfxBeginThread(tetthread, this ); |
这样线程函数中pParam可以不为空指针
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端