_beginthreadex - Problem mit Parameter übergabe an Thread
-
Ich denke das Problem hat weniger mit Threads zu tun.

-
Martin Schmid schrieb:
Ich denke das Problem hat weniger mit Threads zu tun.

Ich denke du hast vollkommen Recht

-
hustbaer schrieb:
Ich denke du hast vollkommen Recht

Schön das mir mal jemand recht gibt.

Aber woran liegt es dann?
-
Du übergibst den Wert der in "p" steht by value an die Thread Funktion.
Das heisst du übergibst eine Kopie des Wertes.Dadurch kann aber der Wert der "in" der originalen Variable "p" steht niemals vom Thread verändert werden, da dieser ja nur eine Kopie des Wertes übergeben bekommen hat, und daher keinen Zugriff mehr auf die originale Variable "p".
Wenn du "p" ändern willst, musst du die Adresse von "p" übergeben.
//main Thread volatile char *b = NULL; // NOTE: volatile ist ein GANZ ÜBLER Hack, bloss // die "Korrekte" Variante zu erklären ist mir // grad viel zu umständlich, sorry. // Auf jeden Fall gehört hier volatile hin, wenn // es überhaupt irgendwie funktionieren soll. if(b == NULL) //bedingung x = _beginthreadex(NULL,0,split_cmd,&b,0,NULL); //thread aufruf // -------------------------------------------------------------------- // -------------------------------------------------------------------- unsigned __stdcall split_cmd(void* param) { char** ppMessage = reinterpret_cast<char**>(param); // Zeiger auf "b" ("b" ist selbst ein Zeiger auf char, daher Typ char**) char* pMessage = *ppMessage; // Wert von "b" (die Kopie des Wertes) free(pMessage); // zum freigeben können wir den Wert (die Kopie des Wertes) verwenden *ppMessage = NULL; // zum Null-Setzen müssen wir auf die originale Variable "b" zugreifen, also über den Zeiger auf "b" gehenDas ist aber trotzdem furchtbares gefrickel.
-
In dieser Zeile:
char** ppMessage = reinterpret_cast<char**>(param);Erhalte ich diese Fehler:
error C2065: 'reinterpret_cast' : undeclared identifier error C2059: syntax error : 'type'
-
Nimm (char**)param. Du scheinst ein C Kompiler zu benutzen.
reinterpret_cast ist C++.
-
compilierst du als C oder C++?
wenn C dann (char**)param
-
hustbaer bist einfach der beste.

Nur was ich nicht so recht verstehe:
Du übergibst den Wert der in "p" steht by value an die Thread Funktion.
Aber ich übergebe doch die Adresse auf die p zeigt?
Und mit dieser Adresse auf die p zeigt wird ja auch im Thread gearbeitet.
Des versteh ich echt nicht.
-
Ja du übergibst die Adresse auf die p (eigentlich b in deinem Beispiel, hatte ich übersehen) zeigt. Das ist "der Wert von p". Da p ein Zeiger ist, ist der Wert von p eine Adresse.
Du willst aber p selbst ändern. Dazu brauchst du nicht die Adresse von dem auf was p zeigt, sondern die Adresse von p selbst. Also einen Zeiger auf einen Zeiger.
-
Danke dir für die Erklärung
Damit hat sich dieses Thema hier ein für alle mal erledigt.
