C++ Windows 线程不会退出

Posted

技术标签:

【中文标题】C++ Windows 线程不会退出【英文标题】:C++ Windows Thread Won't Exit 【发布时间】:2015-06-11 05:43:59 【问题描述】:

在下面的代码中,启动了一个调用网络嗅探器的线程,其输出显示在控制台上。 1500 毫秒后,我希望线程终止,但事实并非如此。你能提供关于我的错误的见解吗?提前感谢您的帮助。

unsigned int __stdcall mythreadB(void* data)


    // declare
    char            *Directory = "c:/Program Files/Wireshark";
    int             Ret = 0;
    string          Tshark_Command = "";

    Ret = _chdir(Directory);
    Tshark_Command = "tshark\ -V -B 5";
    system(Tshark_Command.c_str());

    return 0;


int main(int argc, char* argv[])


    HANDLE          myhandleB;
    myhandleB = (HANDLE)_beginthreadex(0, 0, &mythreadB, 0, 0, 0);
    WaitForSingleObjectEx(myhandleB, 1500,false);
    CloseHandle(myhandleB);

    return 0;

【问题讨论】:

首先,您应该检查每个系统调用返回的内容。如果它返回错误,您应该check what that error is。 【参考方案1】:

线程必须等待“other-app.exe”完成,否则它无法通过system。可能是其他应用卡住了。

换成system("notepad.exe");就可以看到问题了

一种解决方案是使用CreateProcess

unsigned int __stdcall mythreadB(void* data)

    PROCESS_INFORMATION pi =  0 ;
    STARTUPINFO si =  0 ;
    si.cb = sizeof(STARTUPINFO);
    CreateProcess(L"c:\\windows\\system32\\notepad.exe", 
        0, 0, 0, 0, NORMAL_PRIORITY_CLASS, 0, 0, &si, &pi);

    while (WaitForSingleObject(pi.hProcess, 1000))
    
    
    return 0;

现在线程应该在程序退出后终止。注意“notepad.exe”不会终止。您必须使用来自pi.hProcess 的句柄并从main 关闭它。

【讨论】:

@HarryJohnston 这只是一个测试代码,我改了。 感谢 Barmak 和 Joachim 的帮助。你让我指出了正确的方向。

以上是关于C++ Windows 线程不会退出的主要内容,如果未能解决你的问题,请参考以下文章

在退出之前跟踪 - 并正确结束 - C# - C++/CLI - C++ Windows 窗体应用程序中的本机和托管线程

使用 IOCP - C++ - Windows 检测子进程的退出/失败

Windows C++ - 使用 CloseHandle 关闭线程

C++网络编程学习:线程退出安全优化

C++ Windows 套接字 - 在程序退出时关闭套接字

C++ 在 Windows API 中创建一个单独的线程,程序终止?