Datenaustausch zwischen Threads geht nicht
-
Hallo,
mit dem BCB6 habe ich eine kleine Anwendung geschrieben, die Folgendes machen soll:
Nach Betätigung eines Buttons wird die Instanz einer Klasse, die von TThread abgeleitet ist gebildet und gestartet. Innerhalb dieser Klasse wird nun die Instanz einer anderen, ebenfalls von TThread abgeleiteten Klasse gebildet und ebenfalls gestartet.
Diese zweite Instanz schreibt das Ergebnis einer Berechnung in eine globale Variable auf die ich zwar in Thread1 und der OnButton-Methode zugreifen kann, aber sie enthält nicht den erwarteten Wert.
Die globale Variable ist ein char-Pointer.
Was könnte da schief laufen?
TIA Guido
-
hab so etwas ähnliches wie du beschrieben hast in einer meiner Programme. Um dir aber wirklich helfen zu können wäre etwas Code ganz nützlich um sich das wirklich vor Augen führen zu können.
mfg
Tom
-
Atlas schrieb:
Was könnte da schief laufen?
DIe Kristallkugeln sind heute leider aus. Allerdings hat meine kurz vor ihrem Ableben noch bekannt gegeben, das DEINE Kristallkugel* durch sehr schwache Benutzung noch tadellos funktionieren sollte. Benutze sie...
-junix
Kristallkugel ist ein okkultes Requisit das normalerweise zum Hellsehen benutzt wird. Allerdings wurde dieser Sprachgebrauch im C++ Forum verwendet um Leute auf ihren Mangelnden Fehlerbeschrieb aufmerksam zu machen.
Es kamen auch schon Fälle vor, wo Entwickler ihren Debugger und dessen Mittel wie Breakpoints als ausgesprochen wertvolle Kristallkugel zur Fehlerfindung bezeichnet haben.
-
Hallo Tom, hallo junix,
kurz ein paar Codeschnipsel zur Verdeutlichung meiner Misere:
// irgendwo im Header struct myResult { char* wert1; char* wert2; }; // Meine globale Variable // Wird in der Klasse instanziiert, die die Threads started myResult* einErgebnis; // Der CTor __fastcall TmyThread::TmyThread(bool CreateSuspended, AnsiString i_wert1, AnsiString i_wert2) : TThread(CreateSuspended) { // wert1 und wert2 sind private Klassenvariablen wert1 = i_wert1; wert2 = i_wert2; einErgebnis->wert1 = i_wert1.c_str(); einErgebnis->wert2 = i_wert2.c_str(); } // Die Execute-Methode void __fastcall TmyThread::Execute() { // wert1 und wert2 sind jetzt beide NULL!! AnsiString s1 = wert1; AnsiString s2 = wert2; while(!Terminated) { // Irgendeine Berechnung einErgebnis->wert1 = "erg1"; einErgebnis->wert2 = "erg2"; // Diese Werte liegen jetzt in 'einErgebnis' vor // Ein Auslesen der Ergebnisse in der den Thread aufrufenden Klasse liefert // hingegen unsinnige Werte } }Dem CTor des Thread werden Parameter mitgegeben, die er in seinen privaten Variablen abspeichert. Wieso enthalten diese Variablen in der Execute-Methode keine Werte mehr? Und wieso steht in meiner 'einErgebnis'-Struktur nach Beendigung des Threads nicht mehr das, was ich zuvor hineingeschrieben habe?
Kann man alles schön im Debug-Mode verfolgen

Vermutlich habe ich da etwas Prinzipielles übersehen/nicht verstanden...vielleicht habt ihr noch einen Tipp.
TIA Guido
-
Mit AnsiString::c_str() erhälst Du nur einen temporär gültigen Zeiger. Wenn Du diesen später weiter verwenden willst, mußt Du das char-Array in ein neues kopieren - oder gleich AnsiString verwenden.