来源:互联网 发布: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

 

 

 

原创粉丝点击