_beginthreadex - Problem mit Parameter übergabe an Thread
-
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 identifierKonntest 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) {
//irgendwasfree(message) //<----------Hier stürtzt alles ab....
}Also bitte mal die Augen aufmachen beim Lesen.
-
das lässt sich so nicht kompilieren!

-
for(;;) { //irgendwelcher code char *p = calloc(strlen(buffer),sizeof(char)); strcpy(p, buffer); _beginthreadex(NULL,0,cmd,p,0,NULL); }unsigned __stdcall cmd(void* message) { //irgendwas free(message) //<----------Hier stürtzt alles ab.... }Ich denke jeder dürfte jetzt das Problem erkennen.
-
calloc(strlen(buffer) + 1, 1);
-
Leider stürtzt des Programm immer noch bei free() ab.
-
bei mir nicht
#include <windows.h> #include <process.h> #include <iostream> unsigned __stdcall cmd(void* message) { free(message); return 0; } int main() { const char* buffer = "Hallo"; char *p = (char*)calloc(strlen(buffer) + 1, 1); strcpy(p, buffer); _beginthreadex(NULL,0,cmd,p,0,NULL); std::cin.get(); }
-
Es lag tatsächlich an folgenden:
p = (char*)calloc(strlen(puffer)+1,1);Wenn ich es jetzt so wieder mache:
p = calloc(strlen(puffer)+1,1);Dann stürtzt des Programm doch wieder ab.
Kannste mir des mal kurz erklären warum es mit einem cast (char*) klappt?
-
keine ahnung! den cast braucht man nur wenn man c++ benutzt. unter c ist der cast nicht nötig und nicht empfehlenswert.
hier steht's: http://www.c-plusplus.net/forum/viewtopic.php?t=206606
-
ich habs nochmal in c und ohne cast probiert. stürzt auch nicht ab. der fehler liegt bestimmt woanders.
-
Ok das ganze Programm läuft jetzt eigentlich bis auf eine kleinigkeit.
//main Thread char *b = NULL; if(b == NULL) //bedingung x = _beginthreadex(NULL,0,split_cmd,b,0,NULL); //thread aufruf//thread unsigned __stdcall split_cmd(void* message) { free(message); message = NULL;Doch leider zeigt b im "Mainthread" nach ausführung des "Nebenthreads" nicht auf NULL.
-
lass die finger von threads wenn du solche grundlagen nicht verstanden hast.