电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

多线程编程之二——MFC中的多线程开发

12页
  • 卖家[上传人]:壹****1
  • 文档编号:473102101
  • 上传时间:2023-02-27
  • 文档格式:DOC
  • 文档大小:67.50KB
  • / 12 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、多线程编程之二MFC中的多线程开发作者:韩耀旭下载源代码五、MFC对多线程编程的支持MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等。用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等。但对于Win32的API编程而言,这两种线程是没有区别的,它们都只需线程的启动地址即可启动线程来执行任务。在MFC中,一般用全局函数AfxBeginThread()来创建并初始化一个线程的运行,该函数有两种重载形式,分别用于创建工作者线程和用户界面线程。两种重载函数原型和参数分别说明如下: (1) CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam, nPriority=THREAD_PRIORITY_NORMAL, UINT nStackSize=0, DWORD dwCreateFlags

      2、=0, LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);PfnThreadProc:指向工作者线程的执行函数的指针,线程函数原型必须声明如下: UINT ExecutingFunction(LPVOID pParam);请注意,ExecutingFunction()应返回一个UINT类型的值,用以指明该函数结束的原因。一般情况下,返回0表明执行成功。 pParam:传递给线程函数的一个32位参数,执行函数将用某种方式解释该值。它可以是数值,或是指向一个结构的指针,甚至可以被忽略; nPriority:线程的优先级。如果为0,则线程与其父线程具有相同的优先级; nStackSize:线程为自己分配堆栈的大小,其单位为字节。如果nStackSize被设为0,则线程的堆栈被设置成与父线程堆栈相同大小; dwCreateFlags:如果为0,则线程在创建后立刻开始执行。如果为CREATE_SUSPEND,则线程在创建后立刻被挂起; lpSecurityAttrs:线程的安全属性指针,一般为NULL; (2) CWinThread* AfxBeginThr

      3、ead(CRuntimeClass* pThreadClass, int nPriority=THREAD_PRIORITY_NORMAL, UINT nStackSize=0, DWORD dwCreateFlags=0, LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);pThreadClass 是指向 CWinThread 的一个导出类的运行时类对象的指针,该导出类定义了被创建的用户界面线程的启动、退出等;其它参数的意义同形式1。使用函数的这个原型生成的线程也有消息机制,在以后的例子中我们将发现同主线程的机制几乎一样。下面我们对CWinThread类的数据成员及常用函数进行简要说明。 m_hThread:当前线程的句柄; m_nThreadID:当前线程的ID; m_pMainWnd:指向应用程序主窗口的指针 BOOL CWinThread:CreateThread(DWORD dwCreateFlags=0,UINT nStackSize=0,LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);该函数中的

      4、dwCreateFlags、nStackSize、lpSecurityAttrs参数和API函数CreateThread中的对应参数有相同含义,该函数执行成功,返回非0值,否则返回0。一般情况下,调用AfxBeginThread()来一次性地创建并启动一个线程,但是也可以通过两步法来创建线程:首先创建CWinThread类的一个对象,然后调用该对象的成员函数CreateThread()来启动该线程。 virtual BOOL CWinThread:InitInstance();重载该函数以控制用户界面线程实例的初始化。初始化成功则返回非0值,否则返回0。用户界面线程经常重载该函数,工作者线程一般不使用InitInstance()。 virtual int CWinThread:ExitInstance();在线程终结前重载该函数进行一些必要的清理工作。该函数返回线程的退出码,0表示执行成功,非0值用来标识各种错误。同InitInstance()成员函数一样,该函数也只适用于用户界面线程。 六、MFC多线程编程实例在Visual C+ 6.0编程环境中,我们既可以编写C风格的32位Win

      5、32应用程序,也可以利用MFC类库编写C+风格的应用程序,二者各有其优缺点。基于Win32的应用程序执行代码小巧,运行效率高,但要求程序员编写的代码较多,且需要管理系统提供给程序的所有资源;而基于MFC类库的应用程序可以快速建立起应用程序,类库为程序员提供了大量的封装类,而且Developer Studio为程序员提供了一些工具来管理用户源程序,其缺点是类库代码很庞大。由于使用类库所带来的快速、简捷和功能强大等优越性,因此除非有特殊的需要,否则Visual C+推荐使用MFC类库进行程序开发。我们知道,MFC中的线程分为两种:用户界面线程和工作者线程。我们将分别举例说明。用 MFC 类库编程实现工作者线程例程5 MultiThread5为了与Win32 API对照,我们使用MFC 类库编程实现例程3 MultiThread3。1. 建立一个基于对话框的工程MultiThread5,在对话框IDD_MULTITHREAD5_DIALOG中加入一个编辑框IDC_MILLISECOND,一个按钮IDC_START,标题为“开始” ,一个进度条IDC_PROGRESS1; 2. 打开Class

      6、Wizard,为编辑框IDC_MILLISECOND添加int型变量m_nMilliSecond,为进度条IDC_PROGRESS1添加CProgressCtrl型变量m_ctrlProgress; 3. 在MultiThread5Dlg.h文件中添加一个结构的定义: 4. struct threadInfo5. 6. UINT nMilliSecond;7. CProgressCtrl* pctrlProgress;8. ;线程函数的声明:UINT ThreadFunc(LPVOID lpParam); 注意,二者应在类CMultiThread5Dlg的外部。在类CMultiThread5Dlg内部添加protected型变量:CWinThread* pThread; 9. 在MultiThread5Dlg.cpp文件中进行如下操作:定义公共变量:threadInfo Info; 双击按钮IDC_START,添加相应消息处理函数:void CMultiThread5Dlg:OnStart() / TODO: Add your control notification handler

      7、code hereUpdateData(TRUE);Info.nMilliSecond=m_nMilliSecond;Info.pctrlProgress=&m_ctrlProgress;pThread=AfxBeginThread(ThreadFunc,&Info);在函数BOOL CMultiThread3Dlg:OnInitDialog()中添加语句: / TODO: Add extra initialization herem_ctrlProgress.SetRange(0,99);m_nMilliSecond=10;UpdateData(FALSE);return TRUE; / return TRUE unless you set the focus to a control添加线程处理函数: UINT ThreadFunc(LPVOID lpParam)threadInfo* pInfo=(threadInfo*)lpParam;for(int i=0;inMilliSecond;pInfo-pctrlProgress-SetPos(i);Sleep(nTemp);ret

      8、urn 0;用 MFC 类库编程实现用户界面线程创建用户界面线程的步骤:1. 使用ClassWizard创建类CWinThread的派生类(以CUIThread类为例) 2. class CUIThread : public CWinThread3. 4. DECLARE_DYNCREATE(CUIThread)5. protected:6. CUIThread(); / protected constructor used by dynamic creation7.8. / Attributes9. public:10.11. / Operations12. public:13.14. / Overrides15. / ClassWizard generated virtual function overrides16. /AFX_VIRTUAL(CUIThread)17. public:18. virtual BOOL InitInstance();19. virtual int ExitInstance();20. /AFX_VIRTUAL21.22. / Implementation23. protected:24. virtual CUIThread();25.26. / Generated message map functions27. /AFX_MSG(CUIThread)28. / NOTE - the ClassWizard will add and remove member functions here.29. /AFX_MSG30.31. DECLARE_MESSAGE_MAP()32. ;33. 重载函数InitInstance()和ExitInstance()。 34. BOOL CUIThread:InitInstance()35. 36. CFrameWnd* wnd=new CFrameWnd;37. wnd-Create(NULL,UI Thread

      《多线程编程之二——MFC中的多线程开发》由会员壹****1分享,可在线阅读,更多相关《多线程编程之二——MFC中的多线程开发》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.