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

posted @   手写不期而遇  阅读(359)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示