2011-08-17 15 views
6

Zastanawiam się, czy jest możliwe (a jeśli tak, jak), aby uzyskać wartość zwracaną wątku w C++ (Windows). Mam kilka wątków i używam na nich WaitForMultipleObjects(...). To czeka, aż wątek zostanie ukończony, i zwróci indeks wymienionego wątku, a wszystko będzie dobrze. Chcę jednak móc uzyskać wartość zwracaną wątku, który zakończył korzystanie z jego uchwytu.Jak uzyskać wartość zwracaną wątku systemu Windows?

Na przykład:

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? 
    } 
    ... 
} 

Próbowałem użyć GetExitCodeThread(thread) ale jestem przy założeniu, to zwraca kod wyjścia systemu, jak to zawsze daje mi bardzo dziwne całkowitą. Czy ktoś zna sposób lub obejście?

+3

Zawsze używałem GetExitCodeThread. Czy na pewno używasz go poprawnie? Pobiera uchwyt wątku i wskaźnik do DWORD i zwraca sukces GetExitCodeThread (_nie_ zwraca wartość wątku). –

+0

Twoje pytanie jest moją odpowiedzią :) – Koying

Odpowiedz

11

GetExitCodeThread jest prawidłowa funkcja. Oto opis MSDN tego, co robi:

Ta funkcja natychmiast zwraca. Jeśli określony wątek nie zostanie zakończony, a funkcja zakończy się pomyślnie, zwracany status to STILL_ACTIVE. Jeśli wątek został zakończony, a funkcja się powiedzie, stan zwracany jest jeden z następujących wartości:

  • Wartość wyjścia określony w funkcji ExitThread lub TerminateThread.
  • Wartość zwracana z funkcji wątku.
  • Wartość wyjściowa procesu wątku.
+2

'GetExitCodeThread (t1, & retVal)' i zwróciło 4294967295 (retVal jest DWORD). Rzeczywista wartość zwracana w wątku wynosiła -1. Właśnie zorientowałem się, że ints odbiło się od negatywów. Westchnienie... – Sefu

1

trzeba sprawdzić STILL_ACTIVE o wartości jeden z tych wątków może być nadal aktywna

3

Problem z większością programistów polega na tym, że nie zwracają uwagi na ostrzeżenia kompilatora. Na poziomie 4 (/ W4), kompilator produkuje następujące ostrzeżenie po powrocie -1 z funkcji, która powraca DWORD:

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

0

Można użyć C++ 11 Wątki pojęć za pomocą std::future.
Zobacz przykład poniżej.

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 
} 
Powiązane problemy