0

我关闭了所有线程,对话框消失了,但它仍在运行……我可以将其视为仍在运行的进程。所以我必须杀死这个过程。

exit(0)可能不是关闭应用程序的最佳方式。还有其他方法吗,或者这是最好的方法?谢谢


下面的代码帮助了调试器,否则它会崩溃 OnClose。

void CServerDlg::OnClose() 
{
    TerminateThread(this->hThread_TcpIp, 0);
    TerminateThread(this->hThread_ReadData, 0);
    TerminateThread(this->hThread_ReadSetup, 0);

    //exit(0); //<-- not good to use
    CDialog::OnClose();
}
4

2 回答 2

0

没有:

您永远不应该使用 exit() 来终止 Windows 应用程序。

您不应该直接调用消息处理程序,因为大多数消息(包括 WM_CLOSE)是系统在执行某些步骤后发出的。

根据 MSDN,您永远不应该使用 TerminateThread:

TerminateThread 是一个危险的函数,只能在最极端的情况下使用。

你不应该在没有终止所有线程的情况下关闭应用程序,因为每个线程都必须执行一些清理。例如可用内存和 Windows 句柄。这不是一个好的编程习惯,因为终止进程可能会释放内存,但很可能不会释放所有 Windows 资源(用户和系统)。

你应该做什么:

如果您正在使用工作线程,请使用同步机制来终止线程。为此,我建议使用事件对象。您只能将 PostQuitMessage 用于具有消息队列的线程,通常是 GUI 线程。

请求线程终止后,您应该使用 WaitForMultipleObjects 函数,线程终止后,终止主线程。

如果您的对话框是模态主应用程序窗口,请调用 EndDialog。对话终止后,您应该从应用程序 InitInstance 返回 FALSE。

如果您的对话框不是模态对话框,则在终止线程后,您应该调用 DestroyWindow。

于 2012-06-09T14:45:23.373 回答
0

如果 CCatsServerDlg 是应用程序的主对话框,只需调用 OnOK() 或 OnCancel() 即可终止应用程序。无需终止每个线程。当进程退出时,它们将自动终止。

您也可以尝试PostQuitMessage

于 2012-06-09T13:24:58.657 回答