【问题标题】:C++ Windows Thread Won't ExitC++ Windows 线程不会退出
【发布时间】: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

标签: c++ windows multithreading


【解决方案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 的帮助。你让我指出了正确的方向。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
相关资源
最近更新 更多