2011-08-17 2 views
6

C++ (Windows)에서 스레드의 반환 값을 가져 오는 것이 가능한지 궁금한 점이 있습니다. 몇 가지 스레드가 있고 그 중 WaitForMultipleObjects(...)을 사용합니다. 이것은 쓰레드가 끝날 때까지 기다리고, 그 쓰레드의 인덱스를 반환하고, 모두 정상이다. 그러나 핸들을 사용하여 끝난 스레드의 반환 값을 얻을 수 있기를 원합니다. 예를 들어Windows 스레드의 반환 값은 어떻게 얻을 수 있습니까?

은 :

DWORD WINAPI Thread1(void *parameter){ 
    ... 
    if(...) return 0; 
    else return -1; 
} 

DWORD WINAPI Thread2(void *parameter){ 
    ... 
    if(...) return 1; 
    else return 0; 
} 

int main(){ 
    HANDLE t1 = CreateThread(0, 0, Thread1, NULL, 0, 0); 
    HANDLE t2 = CreateThread(0, 0, Thread2, NULL, 0, 0); 
    HANDLE *threads = new HANDLE[2]; 
    threads[0] = t1; 
    threads[1] = t2; 
    int result = WaitForMultipleObjects(2, threads, false, INFINITE); 
    if(result == 0){ 
     //get the threads value here: 
     int retVal = SomeFunction(t1); //What is SomeFunction? 
    } 
    ... 
} 

나는 GetExitCodeThread(thread)를 사용하려고했지만 나는 항상 나에게 매우 이상한 정수를주기 때문에 이것은, 시스템 종료 코드를 반환 있으리라 믿고있어. 누구나 방법이나 해결 방법을 알고 있습니까?

+3

저는 항상 GetExitCodeThread를 사용했습니다. 올바르게 사용하고 있습니까? 그것은 스레드 핸들과 DWORD에 대한 포인터를 취하여 GetExitCodeThread의 성공을 반환합니다 (_not_ 스레드의 반환 값이 아닙니다). –

+0

귀하의 질문에 내 대답은 :) – Koying

답변

11

GetExitCodeThread 올바른 기능입니다 활성화 될 수있는 값 STILL_ACTIVE를 확인해야합니다. 여기에 MSDN 설명이 나와 있습니다.

이 함수는 즉시 반환됩니다. 지정된 스레드에서 이 종료되지 않고 함수가 성공하면 STILL_ACTIVE가 반환됩니다. 스레드가 종료되고 함수가 반환 된 상태는 다음 값 중 하나입니다 성공 경우 다음으로 ExitThread 나 TerminateThread를 함수에 지정된

  • 종료 값을.
  • 스레드 함수의 반환 값입니다.
  • 스레드의 프로세스 종료 값입니다.
+2

'GetExitCodeThread (t1, & retVal)'및 반환 된 4294967295 (retVal은 DWORD)입니다. thread의 실제의 반환 값은 -1입니다. 나는 int가 네거티브에 반발했다는 것을 알아 냈습니다. 한숨... – Sefu

1

당신은 이러한 스레드 중 하나가 여전히

3

대부분의 프로그래머의 문제는 컴파일러 경고에주의를 기울이지 않는다는 것입니다. DWORD를 반환하는 함수에서 -1를 반환 할 때 레벨 4 (/ W4)에서, 컴파일러는 경고를 다음 생성합니다

warning C4245: 'return' : conversion from 'int' to 'DWORD', signed/unsigned mismatch

0

당신은 std::future를 사용하여 C++ (11)의 스레드 개념을 사용할 수 있습니다.
아래 예를 참조하십시오.

int ReturnFrmThread() { 
    return 100; 
} 

int main() { 
    std::future<int> GetRetVal= std::async(ReturnFrmThread); // Execution of ReturnFrmThread starts 
    int answer = GetAnAnswer.get(); // gets value as 100; 
    // Waits until ReturnFrmThread has finished 
} 
관련 문제