假设GUI应用程序的主窗口创建一个帮助UI线程并关闭应用程序。应用程序何时何地有机会清理线程资源?我知道系统会自动清除资源,但这并不能帮助文件等应用程序特定的资源。
作为测试,我在窗口对象的析构函数中编写了MessageBox()
,但在关闭应用程序时不会从辅助线程中调用它们。
系统似乎只是关闭线程,可能是通过内部TerminateThread
或某些此类调用。有没有办法知道具有UI的线程何时终止并捕获它?
我使用的是Win32 API而不是MFC等。
伪代码
OnCreateHelperUI() // called from WndProc under appropriate message
CreateThread(...,UIThread,...)
return
UIThread()
Some auto objects on stack
Some dynamic objects on heap
CreateWindow()
while(GetMessage()){}
delete heap objects
return 0
不会调用auto和heap对象的析构函数。
仅供参考,等待线程句柄没有帮助。它只是让线程粘在一起,迫使用户单独关闭它们。 CloseHandle()
会回到原点。
答案 0 :(得分:3)
线程函数返回时线程关闭。操作系统无法为您执行此操作,您必须将其设计为。一种好方法是让主线程WM_CLOSE处理程序向辅助线程发送信号或消息。辅助线程干净地清理并返回(运行析构函数)。当发生这种情况时,主线程应该等待线程句柄,因此它不会关闭应用程序,直到辅助线程关闭。