什么时候非主GUI线程在Windows中退出?

时间:2014-07-14 20:03:22

标签: c++ multithreading winapi user-interface

假设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()会回到原点。

1 个答案:

答案 0 :(得分:3)

线程函数返回时线程关闭。操作系统无法为您执行此操作,您必须将其设计为。一种好方法是让主线程WM_CLOSE处理程序向辅助线程发送信号或消息。辅助线程干净地清理并返回(运行析构函数)。当发生这种情况时,主线程应该等待线程句柄,因此它不会关闭应用程序,直到辅助线程关闭。

相关问题