2012-10-25 47 views
0

我正在C++ DLL模塊中工作,我需要爲每個X min獨立執行一個任務。我試圖爲該任務創建一個線程,但是創建線程的主程序也將一直等待子線程完成。在C++中創建一個獨立於父代的子線程

是否有人可以幫助我如何獨立於主程序創建單獨的過程(請提供示例代碼,如果可能的話)並執行任務? 該過程應該執行一個函數,併爲每個X min運行函數中存在的代碼。

編輯:直到線程完成

void test(void *param) 
{ 
    cout << "In thread function" << endl; 
    Sleep(1000); // sleep for 1 second 
    cout << "Thread function ends" << endl; 
    _endthread(); 
} 

int main() 
{ 
    HANDLE hThread; 
    cout << "Starting thread" << endl; 
    cout << (hThread = (HANDLE)_beginthread(test,0,NULL)); 
    WaitForSingleObject(hThread, INFINITE); 
    cout << "Main ends" << endl; 
    return 0; 
} 
+1

'CreateThread()'和'beginthreadex()'不要等待線程完成。他們返回一個可用於等待線程完成的句柄。 – hmjd

+1

首先顯示你的代碼 - 例如啓動新線程的代碼。 – kuperspb

+0

通常創建線程並不意味着創建線程需要等待它們完成(這就是線程的全部內容!!)。如果你的意思是你的主進程不應該等待退出,你需要創建一個獨立運行的子進程( - > fork/exec)。你真的應該顯示一些你有的代碼和你有問題的地方。 –

回答

0

WaitForSingleObject()將阻止主。如果你想定期從線程函數test()運行一些東西,你需要在那裏放一個循環。最好在退出時觸發從main()結束線程功能。在您想要退出main()方法之前,您不應該撥打WaitForSingleObject()。因此,您將擁有異步運行的test()方法。

bool endThread = false; 
void test(void *param) 
{ 
    cout << "In thread function" << endl; 
    while(!endThread) 
    { 
     Sleep(1000); // sleep for 1 second 
    } 

    cout << "Thread function ends" << endl; 
    _endthread(); 
} 

int main() 
{ 
    HANDLE hThread; 
    cout << "Starting thread" << endl; 
    cout << (hThread = (HANDLE)_beginthread(test,0,NULL)); 

    // Do any other stuff without waiting for the thread to end 
    // ... 

    endThread = true; 
    WaitForSingleObject(hThread, INFINITE); 
    cout << "Main ends" << endl; 
    return 0; 
} 

請注意,您可能需要同步訪問endThread變量正確使用互斥或​​類似的,樣品應只顯示原理。

UPDATE:

在你想要的線程結束前退出main()情況下,你不能在所有使用線程。

您需要創建一個獨立的子進程,就像我在第一條評論中提到的那樣。查找fork()exec()函數來做到這一點(這些也可能有具體的WinAPI方法,我不知道)。

+0

我實際上需要獨立於main的子線程。我明白,調用WaitForSingleObject會讓main等待,直到孩子完成。但是如果我不打電話,我的孩子會因爲主要退出而死亡。即使主要退出,我也希望孩子執行。 – TechyHarry