2011-08-17 16 views
6

Me preguntaba si es posible (y si es así, cómo) obtener el valor de retorno de un hilo en C++ (Windows). Tengo varios hilos, y uso WaitForMultipleObjects(...) en ellos. Esto espera hasta que se hace un hilo, y devuelve el índice de dicho hilo, y todo está bien. Sin embargo, quiero poder obtener el valor de retorno del subproceso que terminó de usar su identificador.¿Cómo se puede obtener el valor de retorno de un hilo de Windows?

Por ejemplo:

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

me han tratado de utilizar GetExitCodeThread(thread) pero estoy suponiendo que esto devuelve un código de salida del sistema, ya que siempre me da una muy extraña entero. ¿Alguien sabe una forma o una solución alternativa?

+3

Siempre he usado GetExitCodeThread. ¿Estás seguro de que lo estás usando correctamente? Toma un identificador de subproceso y un puntero a un DWORD y devuelve el éxito de GetExitCodeThread (_not_ el valor de retorno del subproceso). –

+0

Tu pregunta es mi respuesta :) – Koying

Respuesta

11

GetExitCodeThread es la función correcta. Aquí está la descripción de MSDN de lo que hace:

Esta función regresa inmediatamente. Si el subproceso especificado no tiene terminado y la función tiene éxito, el estado devuelto es STILL_ACTIVE. Si el hilo ha terminado y la función tiene éxito, el estado devuelto es uno de los siguientes valores:

  • El valor de salida especificado en la función ExitThread o TerminateThread.
  • El valor de retorno de la función de subproceso.
  • El valor de salida del proceso de la secuencia.
+2

'GetExitCodeThread (t1, & retVal)' y devuelto 4294967295 (retVal es un DWORD). El valor de retorno real en el hilo fue -1. Me di cuenta de que las entradas rebotaban en negativos. Suspiro... – Sefu

1

es necesario comprobar para STILL_ACTIVE para los valores de uno de estos hilos pueden estar todavía activa

3

El problema con la mayoría de los programadores es que no prestan atención a las advertencias del compilador. En el nivel 4 (/ W4), el compilador produce siguiente advertencia al volver -1 de una función que regresa DWORD:

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

0

Usted puede utilizar de C++ 11 conceptos hilos usando std::future.
Vea un ejemplo a continuación.

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 
} 
Cuestiones relacionadas