也
来源:互联网 发布:linux软件在哪里下载 编辑:程序博客网 时间:2024/03/29 16:43
背景知识1
在mfc编程中,有三种创建新线程的方式:
类内线程:在类内部用static定义的线程函数。如
C/C++ code
- class a{public:static UINT Func(LPVOID lpParam);}
全局线程:在类外部定义的线程函数。如
- C/C++ code
- UINT Func(LPVOID lpParam);class a{}
类线程:如CMyThread::CWinThread()
背景知识2
在主对话框中点击一个按钮打开一个子对话框,可以有以下几种方式:
方式一:在主对话框的头文件中定义一个子对话框的对象,点击主对话框的按钮时,子对话框的对象.DoModal();
方式二:点击主对话框的按钮时,定义一个子对话框对象,并子对话框的对象.DoModal();
方式三:在主对话框的头文件中定义一个子对话框的指针,点击主对话框的按钮时,先new然后create然后showwindow;
方式四:点击对话框按钮时,定义一个子对话框的指针,先new然后create然后showwindow;
其中,方式一在子对话框关闭时,并没有真的关闭,其生存期与主对话框相同,若想真正关闭,采用以下方式:
见帖子:http://topic.csdn.net/t/20020508/17/706112.html
方式二在关闭子对话框时,可以真正关闭子对话框;
方式三四在关闭子对话框时,也没有真正关闭子对话框,若想真正关闭子对话框,需要在主对话框中delete。(方式三四的区别是堆的问题,请看孙鑫老师的视频)
本文所指的关闭对话框,是指的真正关闭,而不是指对话框虽然不显示,但仍旧存在。
下面开始讲解:
首先,无论在哪里创建了一个新线程,只要线程内部没有退出语句(如afxEndThread),或者线程没执行到return语句,本线程就不会自行退出;
其次,如果在线程外部想关闭某个线程,可以调用TerminateThread()函数关闭。
那么,当一个子对话框创建了一个类内线程或者全局线程时,即使子对话框被真正关闭,线程也不一定会被关闭,假如线程为
那么关闭子对话框后,通过spy++可以看到,本线程仍然存在。
如果想让线程的生命期不长于子对话框的生命期时,可以采取以下两种方式:
1、在子对话框的OnClose消息响应里,TerminateThread()强行关闭;(CloseHandle()函数可以关闭串口,但是不能关闭线程哟)
2、在线程内判断一个子对话框的bool型变量。通过实验,当子对话框真正关闭时,相当于此bool变量为假,可以通过这种手段来判断。
其实写这篇文章,我也不知道我要告诉大家什么,只是我突然想到了这个问题,想要给自己总结以下吧。
其实就几句话:
1、你以为子对话框不存在了,其实子对话框很有可能存在只是隐藏了。
2、子对话框与线程没有必然的联系,线程创建以后,除非正常退出或者强行退出,线程不会随着子对话框的退出而退出。
3、当子对话框真的退出了,而线程要判断子对话框的一个bool型变量,那么此bool型变量相当于假。子对话框的所有值,都相当于不存在或者假。而当子对话框只是隐藏时,比如方式一二四,那么对话框的所有值仍保持原貌。因为真正退出以后,传入线程的this指针就已经失效了。
以上结果本人均用spy++进行了测试,保证了事实上的准确性。
转载请注明:CSDN:sdytdhl@126.com
- 也
- 也无题
- 也?浪个搞勒?
- 也u
- 命也
- 哦也
- 也看看
- 《志也》
- 也咬文嚼字
- [成也Java,败也Java]之[败也Java]
- [成也Java,败也Java]之[成也Java]
- 这也为何,那也为何。
- 哭也一天,笑也一天
- 修女也疯狂,数据库也童话
- 成也会议,败也会议
- 北海:成也房地产,败也房地产
- 聚也依依,散也依依
- 荣智健:成也资本 败也资本
- 深入理解Android消息处理系统——Looper、Handler、Thread
- 查看C++数据类型的字节数
- uBuntu Linux系统下面的常用命令
- Android开发手记
- spring与freemarker集成,顺带spring mvc的helloword部署
- 也
- poj 3653 bfs上的dp
- 用JFreeChart 生成报表
- 日版 iphone 3gs 4.3.2 搞定
- 大端,小端问题
- Windows 2003 PHP环境搭建教程
- 监控系统解围企业应用集成平台困境
- 位运算优化
- 个人知识管理