MFC-多线程
2023-04-18 15:44:02 时间
![](https://img2023.cnblogs.com/blog/1502586/202303/1502586-20230314101133088-1235898563.png)
方法一:CreateThread
一般在WIN32环境下使用
DWORD WINAPI func(LPVOID lpParam)//线程函数 //注意格式 { int n = (int)lpParam; CString str; str.Format(_T("n=%d"),n); AfxMessageBox(str); return 0; } void CduoxiancenDlg::OnBnClickedButton1() { DWORD ID = 0; HANDLE thread = CreateThread(NULL, 0, func, (LPVOID)123, 0, &ID); /* 参数1:设为NULL 参数2:设置初始栈的大小,以字节为单位,如果为0,那么使用默认栈空间大小(1M) 参数3: 线程函数的指针 参数4:LPVOID 向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL 参数5:线程标志,可取值如下 CREATE_SUSPENDED(0x00000004):创建一个挂起的线程 0:表示创建后立即激活 参数6:DWORD 保存新线程的id。如果不需要可以NULL 返回值:函数成功,返回线程句柄;函数失败返回false。若不想返回线程ID,设置值为NULL 说明:线程终止运行后,线程对象仍然在系统中,必须通过CloseHandle函数来关闭该线程对象 */ BOOL b=CloseHandle(thread);//关闭线程 //参数:线程句柄 //返回值:TRUE:执行成功;FALSE:执行失败,可以调用GetLastError()获知失败原因 }
方法二:AfxBeginThread--推荐
一般在MFC环境下使用
功能是创建用户界面线程和工作者线程
工作线程:与界面没有关系的线程
UINT func1(LPVOID pParam) //线程函数 //注意格式 { int n = (int)pParam; CString str; str.Format(_T("n=%d"),n); AfxMessageBox(str); return 0; } void CduoxiancenDlg::OnBnClickedButton2() { //AfxBeginThread线程会自动释放 CWinThread* pp= AfxBeginThread(func1,LPVOID(456),0,0,0,NULL);//创建工作线程 //工作线程与界面没有关系 /* 参数1:线程的入口函数,声明一定要如下: UINT MyThreadFunction(LPVOID pParam),不能设置为NULL 参数2:传递到线程的参数,注意它的类型为:LPVOID,所以我们可以传递一个结构体入线程 参数3:线程的优先级,一般设置为 0 .让它和主线程具有共同的优先级 参数4:新创建的线程的栈的大小.如果为 0,使用默认大小(1M) 参数5:CREATE_SUSPENDED : 线程创建以后,会处于挂起状态,直到调用:ResumeThread 0 : 创建线程后就开始运行 参数6:指向一个 SECURITY_ATTRIBUTES 的结构体,用它来标志新创建线程的安全性. 如果为 NULL,那么新创建的线程就具有和主线程一样的安全性 返回值: 成功时返回一个指向新线程的线程对象的指针,否则NULL 如果要在线程内结束线程,可以在线程内调用 AfxEndThread. */ pp->m_hThread;//线程句柄 pp->m_nThreadID;//当前线程的 ID pp->m_bAutoDelete;//值为1时(默认),线程终止时自动销毁对象 }
在线程函数中调用类成员变量和类成员函数
UINT func1(LPVOID pParam) { CduoxiancenDlg* p = (CduoxiancenDlg*)pParam; //创建主对话框的指针=类指针 int n = p->tt; CString s = p->str; //获取类成员变量 ::OutputDebugString(s); int nn = p->add(2,30); //调用类成员函数 s.Format(_T("nn=%d"), nn); ::OutputDebugString(s); return 0; } void CduoxiancenDlg::OnBnClickedButton2() { tt = 300; str = _T("祖国万岁"); CWinThread* pp= AfxBeginThread(func1,this,0,0,0,NULL); //参数2传递的是类指针 } int CduoxiancenDlg::add(int a, int b) { return a+b; }
方式三:_beginthreadex
一般在c、c++ 环境中使用
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击