c ++ - Hvordan kan du få returværdien af ​​en Windows-tråd?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg spekulerede bare på, om det er muligt (og hvis ja, hvordan) for at få returværdien af ​​en tråd i C ++ (Windows). Jeg har flere tråde, og jeg bruger WaitForMultipleObjects(...) på dem. Dette venter, indtil en tråd er færdig, og returnerer indekset for tråden, og alt er godt. Men jeg vil gerne kunne få returværdien af ​​den tråd, der er færdig med at bruge håndtaget.


For eksempel:


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


Jeg har forsøgt at bruge GetExitCodeThread(thread), men jeg antager, at det returnerer en systemudgangskode, da det altid giver mig et meget underligt heltal. Har nogen en vej eller en løsning?

Bedste reference


GetExitCodeThread er den rigtige funktion. Her er MSDN beskrivelsen af ​​hvad den gør: [9]



  Denne funktion vender tilbage straks. Hvis den angivne tråd ikke har det
  afsluttet og funktionen lykkes, er statusen returneret
  STILL\_ACTIVE. Hvis tråden er afsluttet, og funktionen lykkes,
  Den returnerede status er en af ​​følgende værdier:

  
  

      
  • Den udgangsværdi, der er angivet i funktionen ExitThread eller TerminateThread.

  •   
  • Returværdien fra trådfunktionen.

  •   
  • Afslutningsværdien af ​​trådens proces.

  •   


Andre referencer 1


Problemet med de fleste programmører er, at de ikke tager hensyn til compiler advarsler. På niveau 4 (/W4) producerer kompilatoren følgende advarsel, når de returnerer -1 fra en funktion, der vender tilbage DWORD:


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

Andre referencer 2


du skal kontrollere for STILL\_ACTIVE for de værdier, som et af disse tråde stadig kan være aktive

Andre referencer 3


Du kan bruge C ++ 11 's tråde koncepter ved hjælp af std::future.

Se et eksempel nedenfor.


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
}