2017-07-01 51 views
0

我试图执行一个程序,并等待输出,但这是在一个线程下运行,但当 尝试等待与CreateProcess()的'WaitForSingleObject'的输出时崩溃的程序。线程Syn在C++

我也想将关闭时创建的线程的处理完成由创建进程的CreateProcess的“

class test{ 
    public: 
     static void fun2(void * args){ 
     /*...*/ 
      if (!CreateProcess(NULL, Args, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &StartupInfo, &ProcessInfo)) { 
       return GetLastError();  
      } 

      WaitForSingleObject(ProcessInfo.hProcess, INFINITE); 
      ULONG rc; 
      if(!GetExitCodeProcess(ProcessInfo.hProcess, &rc)){ 
       status = 0; 
      } 
     /*...*/ 
     } 
     void fun1(){ 
     /* ... */ 
      HANDLE h = NULL; 
      h = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)fun2,&data,0,0); 
      if(h!=NULL){ 
       printf("OK\n"); 
      } 
     /* ... */ 
     } 
}; 

int main(){ 
    test t; 
    t.fun1(); 
    return 0; 
} 
+1

为什么不使用'std :: thread'和可用的同步机制? – 2017-07-01 18:43:16

+0

我是新的线程,我会尝试,谢谢。 – MrNuget

回答

2

的主要问题(在您提供的片段)是这一部分:(LPTHREAD_START_ROUTINE)fun2。您的fun2与ThreadProc不兼容。 ThreadProc声明为:

DWORD WINAPI ThreadProc(LPVOID lpParameter); 

WINAPI解析为__stdcall这是从默认cdecl另一个调用约定。作为快速解决方案,您可以将WINAPI添加到fun2声明中。这可能有帮助。如果没有,请提供一个更完整的示例(阅读如何创建mcve),人们可以通过编译重现错误。

或者只是使用std::thread,这将更便携。

例子:

#include <stdio.h> 
#include <thread> 

class test{ 
    public: 
     static void fun2(void * args){ 
      printf("OK from thread\n"); 
     } 
     void fun1(){ 
      std::thread t([]{ 
       fun2(nullptr); 
      }); 
      printf("OK\n"); 
      t.join(); 
     } 
}; 

int main(){ 
    test t; 
    t.fun1(); 
    return 0; 
} 

谨防std::thread生命周期的 - 如果它,而线程仍在运行的真实破坏,整个程序将终止。在std::thread超出范围之前致电join,从而确保正确的操作顺序。

+0

谢谢,以及如何在fun2()完成时关闭线程,否则关闭fun()时会关闭线程? – MrNuget

+0

谢谢,但我不能传递一个结构fun2()。 FUN2(&myStr中); – MrNuget

+0

[]'构造是[lambda表达式](https://msdn.microsoft.com/zh-cn/library/dd293608.aspx),您可以在括号之间传递输入数据。 – rustyx