2017-07-01 30 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