Rückgabewert eines Threads in main weiterverarbeiten



  • Hallo ich möchte mit c aus einem thread das ergebniss in main programm weiterverarbeiten.
    ich schaffe es variablen aus der main beim öffnen des threads an ihn zu übergeben aber nicht andersrum 😞 😞 😞

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    
    DWORD WINAPI Thread(int b)
    {
    b=b+5;
    printf("%d\n",b);
    return (b);
    }
    
    int main(int argc, char *argv[])
    {
    
     int u=1; 
     int g=0;; 
    
    CreateThread(NULL, 0, Thread, u, 0, g);
    
    sleep(1000);
    
    printf("%d\n",g);
    
    system("pause");
    return 0;
    }
    

    Bitte um HILFE 🙂 :p



  • Hallo,

    Die Signatur für die Thread Funktion nimmt keinen int als Argument, sondern LPVOID. Nun stellt sich doch wieder das Problem wie die Daten in den Thread hineinkommen.

    Das geht z.B. so:

    #include <stdio.h>
    #include <windows.h>
    
    typedef struct ThreadParams_t
    {
       int a;
       int b;
    } ThreadParams;
    
    DWORD WINAPI ThreadFunc(LPVOID args)
    {
       ThreadParams* params = (ThreadParams*)args;
       int c = params->a + params->b;
       printf("Das %i + %i = %i\r\n", params->a, params->b, c);
       return 0;
    }
    
    int main()
    {
       ThreadParams params = { 23, 24 };
       HANDLE thread = CreateThread(NULL, 0, &ThreadFunc, &params, 0, NULL);
    
       // Warten bis der Thread fertig ist.
       WaitForSigleObject(thread, INFINITE);
       CloseHandle(thread);
    
       return 0;
    }
    

    Daten aus den Thread wieder zurück-bringen geht mit der gleichen Technik:

    #include <stdio.h>
    #include <windows.h>
    
    typedef struct ThreadParams_t
    {
       int a;
       int b;
       int c;
    } ThreadParams;
    
    DWORD WINAPI ThreadFunc(LPVOID args)
    {
       ThreadParams* params = (ThreadParams*)args;
       params->c = params->a + params->b;
       return 0;
    }
    
    int main()
    {
       ThreadParams params = { 23, 24, 0 };
       HANDLE thread = CreateThread(NULL, 0, &ThreadFunc, &params, 0, NULL);
    
       // Warten bis der Thread fertig ist.
       WaitForSigleObject(thread, INFINITE);
       CloseHandle(thread);
    
       printf("Das %i + %i = %i\r\n", params.a, params.b, params.c); 
    
       return 0;
    }
    

    Falls Du trotzdem am Rückgabe-Wert der Thread Funktion interessiert bist, geht das mit GetExitCodeThread(...): http://msdn.microsoft.com/en-us/library/windows/desktop/ms683190(v=vs.85).aspx

    Hinweis: CreateThread(..) sollte nicht verwendet werden falls bestimmte Funktionen aus der CRT verwendet werden - im Zweifelsfall einfach nicht verwenden. Anstelle kann _beginthreadex(..) verwendet werden: http://msdn.microsoft.com/en-us/library/kdzttdcb(v=vs.80).aspx

    Edit: typedef struct ... hinzugefügt (weil C und nicht C++).
    Edit2: printf(..) hinzugefügt



  • ok DANKE

    würde **GetExitCodeThread(...)**den wert von return auslesen können????



  • c_flo schrieb:

    würde **GetExitCodeThread(...)**den wert von return auslesen können????

    Ja, dafür ist es da. Nur ist es beschränkt auf DWORD (und dahin konvertierbare Typen).



  • Wenn man die Hilfe zu GetExitCodeThread liest, kommt man schnell zu dem Entschluss, dass man diese Methode nicht verwenden sollte (259!) 😉

    Mach es so wie es theta gesagt hat, das ist auch jeden Fall der 100% richtige Weg.



  • ok
    ich habe es hinbekommen

    🙂

    VIELEN DANK


Anmelden zum Antworten