2011-08-17 21 views
6

Mi stavo chiedendo se è possibile (e in tal caso, come) ottenere il valore di ritorno di un thread in C++ (Windows). Ho diversi thread e io uso WaitForMultipleObjects(...) su di essi. Questo attende fino a quando un thread è fatto, e restituisce l'indice di detto thread, e tutto va bene. Tuttavia, voglio essere in grado di ottenere il valore restituito dal thread che ha terminato l'utilizzo del suo handle.Come si può ottenere il valore di ritorno di un thread di Windows?

Ad esempio:

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

ho cercato di utilizzare GetExitCodeThread(thread) ma sto assumendo questo restituisce un codice di uscita del sistema, in quanto mi dà sempre una strana intero. Qualcuno conosce un modo o una soluzione?

+3

Ho sempre utilizzato GetExitCodeThread. Sei sicuro di usarlo correttamente? Prende un handle di thread e un puntatore a un DWORD e restituisce il successo di GetExitCodeThread (_non_ il valore di ritorno del thread). –

+0

La tua domanda è la mia risposta :) – Koying

risposta

11

GetExitCodeThread è la funzione corretta. Ecco la descrizione MSDN di ciò che fa:

Questa funzione restituisce immediatamente. Se il thread specificato non ha terminato e la funzione ha esito positivo, lo stato restituito è STILL_ACTIVE. Se il filo è terminato e la funzione riesce, lo stato restituito è uno dei seguenti valori:

  • Il valore di uscita specificato nella funzione ExitThread o TerminateThread.
  • Il valore di ritorno dalla funzione thread.
  • Il valore di uscita del processo del thread.
+2

'GetExitCodeThread (t1, & retVal)' e restituito 4294967295 (retVal è un DWORD). Il valore di ritorno effettivo nel thread era -1. Ho appena capito che gli interi sono rimbalzati ai negativi. Sospiro... – Sefu

1

è necessario verificare la presenza di STILL_ACTIVE per i valori uno di questi fili può essere ancora attivo

3

Il problema con la maggior parte dei programmatori è che non prestano attenzione agli avvisi del compilatore. A livello 4 (/ W4), il compilatore produce seguente avviso quando si ritorna -1 da una funzione che restituisce DWORD:

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

0

È possibile utilizzare C++ 11 di fili concetti utilizzando std::future.
Vedere un esempio qui sotto.

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 
} 
Problemi correlati