Come si può ottenere il valore di ritorno di un thread di Windows?

Mi stavo chiedendo se è possibile (e se sì, come) per ottenere il valore di ritorno di un thread in C++ (Windows). Ho diversi thread, e io uso WaitForMultipleObjects(...) su di loro. Questo in attesa fino a quando un thread è fatto, e restituisce l’indice di detto filo, e tutto va bene. Tuttavia, voglio essere in grado di ottenere il valore di ritorno del thread che ha finito con la sua maniglia.

Per 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 provato ad usare GetExitCodeThread(thread) ma sto assumendo questo restituisce un sistema di codice di uscita, come sempre, mi dà molto strano intero. Qualcuno sa un modo, o una soluzione?

Ho sempre usato GetExitCodeThread. Sei sicuro di stare usando correttamente? Ci vuole un filo di gestire e un puntatore a un valore DWORD e restituisce il successo di GetExitCodeThread (non il valore di ritorno del thread).
La tua domanda la mia risposta 🙂

OriginaleL’autore Sefu | 2011-08-17

4 Replies
  1. 11

    GetExitCodeThread è la funzione corretta. Qui è MSDN descrizione:

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

    • Il valore di uscita specificato nel ExitThread o TerminateThread funzione.
    • Il valore restituito dalla funzione di thread.
    • Il valore di uscita del filo di processo.
    GetExitCodeThread(t1, &retVal) e restituito 4294967295 (retVal essere un valore DWORD). Il rendimento effettivo valore nel thread di -1. Ho appena capito il ints rimbalzato ai negativi. Sigh…

    OriginaleL’autore Don Reba

  2. 3

    Il problema con la maggior parte del programmatore è quello di non prestare attenzione agli avvisi del compilatore. Al livello 4 (/W4), il compilatore produce il seguente messaggio di avviso quando ritorno -1 da una funzione che restituisce DWORD:

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

    OriginaleL’autore Ajay

  3. 1

    è necessario controllare per STILL_ACTIVE per i valori di uno di questi thread può essere ancora attivo

    OriginaleL’autore AppDeveloper

  4. 1

    È possibile utilizzare C++ 11 del thread 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
    }

    OriginaleL’autore shivakumar

Lascia un commento