_beginthreadex - Problem mit Parameter übergabe an Thread



  • Hallo,
    ich programmiere jetzt schon lange mit C aber dieser Fehler ist mir total fremd.
    Ich poste zuerst mal hier das Problem:

    sprintf(buffer,"TEST");
     printf("buffer: %s\n",buffer); //hier wird mir TEST ausgegeben
    _beginthreadex(NULL,0,(void *)cmd,(char *)buffer,0,NULL);
    

    Die Funktion cmd() wird aufgerufen und ich lasse mir den Inhalt von buffer ausgeben aber buffer ist leer.
    So sieht der Kopf der Funktion cmd() aus:

    void cmd(char *message)  {
    printf("message: %s\n",message); //Message ist leer
    

    Wo ist mein Fehler?
    Bin schon total am verzweifeln.



  • Wenn 'buffer' eine lokale Variable ist, dann kann die Adresse von 'message' in der Threadfunktion bereits ungültig sein. Besser dynamische Strings verwenden.



  • Glaube ich ehrlich gesagt nicht.
    Da der Code:

    sprintf(buffer,"TEST");
     printf("buffer: %s\n",buffer); //hier wird mir TEST ausgegeben
    _beginthreadex(NULL,0,(void *)cmd,(char *)buffer,0,NULL);
    

    Normal in ner unendlich Schleife läuft.



  • Überprüfe mal die Aufrufkonvention der Thread-Funktion:

    unsigned __stdcall ThreadFunc( void* pArguments )
    


  • @Martin Schmied:
    Post doch mal ein ganzes Bsp.
    Bei deinem Code kann vieles schief sein, muss nicht, aber kann.
    Man siehts halt nicht. So z.B. die Lebensdauer von buffer.

    Edit
    Ausserdem warum castest Du den FP von cmd nach void*?
    Schreibe eine Thread Funktion mit korrekter Signatur!

    Simon



  • Martin Schmid schrieb:

    Wie sieht den eine korrekte Signatur aus?

    Die hatte ich schon geschrieben:

    unsigned __stdcall ThreadFunc( void* pArguments )
    


  • Oh da muss ich mich entschuldigen habe den Thread vorhin nur schnell überflogen.



  • Ok läuft jetzt alles perfekt.
    Es scheint wirklich so als ob es an der falschen Signatur lag.
    Bevor ich wieder einen neuen Thread starte poste ich mal meine Frage hier.
    Wie kann ich eigentlich mit beginthreadex() und Funktionen mit Rückgabewerten arbeiten?



  • Tu dir selbst einen gefallen, und verwende eine Library, die das ganze etwas besser kapselt. Boost.Thread z.B.
    Ist viel weniger Stress.

    Mit Rückgabewerten kannst du arbeiten, indem du z.B. in der Struktur die du mit übergibst, ein Member vom Typ des Rückgabewerts hast.
    Anstatt den zu "returnen" schreibst du den in die Struktur rein.

    Dann musst du natürlich im anderen Thread noch darauf warten dass der "Thread mit Rückgabewert" beendet wurde, und dann kannst du den Wert aus der Struktur auslesen.

    BTW: kennt jmd. eine brauchbare Future-Implementierung die man hier empfehlen könnte? Das zu Fuss zu programmieren ist ja doch sehr fad und unnütz...



  • Muss den Thread leider wieder refreshen da ich jetzt doch folgendes Problem habe:

    Wenn 'buffer' eine lokale Variable ist, dann kann die Adresse von 'message' in der Threadfunktion bereits ungültig sein. Besser dynamische Strings verwenden.

    Wie mache ich den das ganze mit dynmaschichen Strings?
    Weil das Problem ist halt das in jedem Durchlauf buffer neu beschrieben wird.
    Wenn ich des jetzt so mache:

    char *p=NULL;
    
    p= realloc(100,sizeof(char)); //elemente
    
    for(;;)
    {
    //irgendwelcher code
    p = &buffer[0]; //ja ich weiß die adress zuweisung würd auch anders gehen
    _beginthreadex(NULL,0,cmd,p,0,NULL); 
    }
    

    Jetzt würde sich doch trotzdem der buffer inhalt dauernt ändern.
    Also wie mache ich das am besten?



  • for(;;)
    {
    //irgendwelcher code
    
    char *p = new char[strlen(buffer) + 1];
    strcpy(p, buffer);
    _beginthreadex(NULL,0,cmd,p,0,NULL); 
    }
    

    und im thread dann

    delete [] p;
    


  • char *p = new char[strlen(buffer) + 1];
    

    Erhalte in der Zeile diesen Fehler:

    error C2065: 'new' : undeclared identifier
    

    Konntest du mir das kurz mit dem new erklären?
    Ich meine das ganze würde doch kein Unterschied machen wenn ich es mit realloc oder calloc machen würde oder?
    Und anstatt delete dann einfach free()?



  • Du kannst natürlich auch malloc/free verwenden, wenn Dir das lieber ist.



  • Entschuldige das ich lange Zeit nichts mehr zu dem Thema schrieb aber ich war bis gestern im Urlaub.
    😉

    Du kannst natürlich auch malloc/free verwenden, wenn Dir das lieber ist.

    Leider stürtzt mein Programm immer ab wenn ich folgendes mache:

    unsigned __stdcall cmd(void* message) {
    //irgendwas
    
    free(message) //Hier stürtzt alles ab....
    }
    


  • Weiß keiner eine Lösung?
    Ist echt dringend!



  • Am Sinnvollsten ist es, den vorhandenen Code zu nehmen und Stück für Stück in eine neue Sourcecode-Datei zu kopieren, so dass er möglichst kurz bleibt und dennoch den Fehler beinhaltet. Häufig stolpert man beim Erstellen dieses minimalen Codebeispiels selbst über die Fehlerursache.



  • Naja das hilft mir auch nicht wirklich weiter,da ich nicht weiß wie ich den Fehler beheben kann.
    Es liegt ja nur an einer Zeile.



  • zeig einfach ein minimalen, kompletten, komplierbaren code der zum abstürz führt. dann kann man dir auch helfen.



  • Leider stürtzt mein Programm immer ab wenn ich folgendes mache:

    unsigned __stdcall cmd(void* message) {
    //irgendwas

    free(message) //<----------Hier stürtzt alles ab....
    }

    Also bitte mal die Augen aufmachen beim Lesen.



  • das lässt sich so nicht kompilieren! 😉


Anmelden zum Antworten