用独立线程解决弹出模态对话框后执行自定义函数问题-vcmfc-提供最全面实用的j(精编版)_第1页
用独立线程解决弹出模态对话框后执行自定义函数问题-vcmfc-提供最全面实用的j(精编版)_第2页
用独立线程解决弹出模态对话框后执行自定义函数问题-vcmfc-提供最全面实用的j(精编版)_第3页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、用独立线程解决弹出模态对话框后执行自定义函数问题- vcmfc - 提供最全面实用的j. 用独立线程解决弹出模态对话框后执行自定义函数问题模态对话框在执行domodal() 时,当前线程处于阻塞状态。因此,只有当退出该对话框时,当前线程才能继续执行。你的要求很另类,既要模态对话框,又要执行另一个函数,可以用新建线程的方法来解决单独创建一个线程,在该线程中创建模态对话框,当对话框创建完成时置位主线程的某事件句柄,使得阻塞的线程可以继续执行某函数。例程:设 cdlgmodal 为模态对话框类,设cviewmain 为创建cdlgmodal 的主线程对象 (此时要求cviewmain 类的必须是cw

2、nd 类的子孙类)在 cviewmain 的头文件 viewmain.h 中加入自定义消息的定义 1. 在 cviewmain 类的声明中加入一个线程指针,并在cviewmain 类构造函数中为其赋值null cwinthread* pthrdmodaldlg; / 模态对话框线程指针(此线程为工作者线程就足够了,生成方法见下文)2. 在viewmain.h 中加入全局回调函数声明及友元声明2.1 在 viewmain.h 末尾(cviewmain 类的声明的体外) 加入回调函数声明uint afx_cdecl callbackmodaldlg(lpvoid pparam); / 接收并解析报

3、文线程用的回调函数2.2 在 cviewmain 类的声明的体内加入事件句柄变量,加入对回调函数、 cdlgmodal 类的友元声明(视情况可忽略)friend uint afx_cdecl callbackmodaldlg(lpvoid pparam); / 声明回调函数为友元函数,在该线程内部任意访问 cviewmain 对象的各个成员变量或函数;假如你不需要访问的话,可以忽略此句。friend class cdlgmodal; / 声明 cdlgmodal 为友元类,这样模块对话框对象可任意访问cviewmain 对象的各个成员变量或函数;假如你不需要访问的话,可以忽略此句。public

4、: handle m_heventmodeldlgcreated; / 事件句柄, 标识模态对话框是否创建。此变量最好设为公有类型,否则如果没有上句的友元声明的话,cdlgmodal 对象将无法置位此事件句柄 3. 在 viewmain.cpp 中实现回调函数体/*/ /* 创建模态对话框用专用的线程pthrdmodaldlg用的回调函数*/ /*/ uint afx_cdecl callbackmodaldlg(lpvoid pparam) cviewmain* pviewmain=null; pviewmain=(cviewmain*)pparam; / 通过线程构造时的lpvoid pp

5、aram 变量来传递指向cviewmain 的指针。如果前面声明了此回调函数为cviewmain 类的友元的话, 以后可以通过这个指针来任意调用cviewmain 对象的成员变量和函数cdlgmodal dlg(pviewmain); / 创建模态对话框,将cviewmain 对象指针作为参数传递给cdlgmodal dlg.domodal(); / 执行 cdlgmodal 对话框/ 对话框退出时,本线程退出pviewmain->pthrdmodaldlg=null; / 将 cviewmain 对象的 pthrdmodaldlg置空,这样下次可以再次产生本线程来创建模态对话框

6、pviewmain=null; :afxendthread(0); return 0; 4. 在 viewmain.cpp 中实现线程创建与句柄关闭4.1 cviewmain 类的合适位置(某函数内,某按钮处理函数,自己任意指定)加入创建模态对话框线程的代码if (pthrdmodaldlg=null) / 判断线程是否已经创建,没创建时新建一个,如果已创建线程(模态对话框未关闭),就忽略 pthrdmodaldlg=:afxbeginthread(:callbackmodaldlg,this,thread_priority_normal,0,create_suspended,null); /

7、 创建线程,并处于休眠状态assert(pthrdmodaldlg); m_heventmodeldlgcreated=createevent(null,true,false,_t(modaldlgcreated); / 此事件初始状态为false,必须手动复位:resetevent(m_heventmodeldlgcreated); / 复位此标识pthrdmodaldlg->resumethread(); / 唤醒该线程if (wait_object_0=waitforsingleobject(m_heventmodeldlgcreated, 2000) / 阻塞当前线程,等

8、待m_heventmodeldlgcreated 标识在 cdlgmodal:oninitdialog()中被置位,超时为2000 毫秒(视情况而定,机器负荷不重的时候 2 秒足够了)。waitforsingleobject 函数返回wait_object_0 表示在规定时间(2000 毫秒)内该标识被置位。其它返回值请参阅msdn dosomething(); / 模态对话框已创建,执行自定义的函数 4.2 在 cviewmain 类析构函数中关闭事件句柄cviewmain:cviewmain() closehandle(m_heventmodeldlgcreated); 5. 在 cdlg

9、modal 类的头文件中加入对viewmain.h 文件的包含,并添加一个指向cviewmain 的指针成员变量#include viewmain.h 在 cdlgmodal 类声明中加入:cviewmain* m_pviewmain; 6. 修改 cdlgmodal 类的构造函数和 oninitdialog() cdlgmodal:cdlgmodal(cwnd* pparent /*=null*/) : cdialog(cdlgmodal:idd, pparent) , m_pviewmain(null) m_pviewmain=(cviewmain*)pparent; / m_pviewm

10、ain是指向 cviewmain 的指针 bool cdlgmodal:oninitdialog() cdialog:oninitdialog(); / todo: 在此添加额外的初始化/ 执行你自定义的另一个函数,此函数执行起来后模态对话框就显示了:setevent(m_heventmodeldlgcreated); / 指示标识模态对话框已经创建,此时在cviewmain 中用waitforsingleobject 阻塞的线程可以继续执行自定义函数return true; / return true unless you set the focus to a control / 异常 : ocx 属性页应返回false 小结:此方法的本质就是先创建一个工作者线程,在该线程中创建模态对话框。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论