Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Problem mit Thread und Variablen
ALF - So 25.07.10 13:55
Titel: Problem mit Thread und Variablen
Dazu kurz info!
Form3 in dem der Thread gestarted wird ist ein MDIChild.
Die Variablen in Form3 um die es hier geht sind:
xzoom: integer;
wavebufL : array of smallint;
wavebufR : array of smallint;
zur Zeit sind diese Global.
Nun habe ich festgestellt, geht nicht, diese müssen Privat werden!
Grund, zur Laufzeit wird die Form3 ja mehrmals aufgerufen und diese Variablen werden damit leider überschrieben!
Die Variable xzoom stellt kein Problem dar, denn die kann ich dem Thread mit übergeben!
Was mach ich aber mit den beiden Arrays? Die werden im Thread komplett gefüllt, wenn das erledigt, dann wird der Thread beendet.
Der Aufruf des Threads erfolgt das erste mal im oncreate der Form3.
Später dann noch, wenn die Variable xzoom verändert wird!
Frage ist also, wie löse ich das mit den beiden Arrays??
Gruss Alf
Gausi - So 25.07.10 14:04
Zugriff auf Daten von mehreren Threads aus (bei dir VCL und ein weiterer) ist nie eine gute Idee. Das hat auch mit Public oder Private nichts zu tun.
Sorge dafür, dass immer nur ein Thread auf das Array zugreift, z.B. über Synchronize. D.h. wenn der Thread die Arrays (das sind dann Variablen vom Thread) befüllt hat, dann ruft er mit Synchronize eine Prozedur auf, die die Daten in das Fenster kopiert.
ALF - So 25.07.10 14:50
Danke erst mal für die Erklärung!
Gausi hat folgendes geschrieben : |
| Zugriff auf Daten von mehreren Threads aus (bei dir VCL und ein weiterer) ist nie eine gute Idee. Das hat auch mit Public oder Private nichts zu tun. |
Ok der Aufruf erfolgt doch so NewForm:= TForm3.Create(self).
Aber, der Thread wird doch in der eigentlichen NewForm nur einmal gestartet und nicht mehrmals gleichzeitig. Die Variablen befinden sich auch in NewForm und nicht in der MainForm(MIDIForm).
Oder ist der
Thread der selbe, wenn die Form3(MDICHILD) als NewForm mehrmals zur gleichen Zeit geöffnet ist!?
Das weiss ich natürlich nicht!?
Gruss Alf
Gausi - So 25.07.10 15:01
Du verwechselst hier Formen und Threads, glaube ich. Die Form3 und die Mainform laufen im selben Thread - dem VCL-Thread. Form3 und Mainform können wild ihre Daten und Variablen beschreiben und lesen bis sie wund und pixelig sind. Da kann (fast) nichts passieren, da das immer schon eins nach dem anderen abläuft.
Ein Thread kann aber "gleichzeitig" auf die Variablen zugreifen. Stell dir einfach vor, du liest gerade ein Buch, und jemand anders fängt an, gleichzeitig in dem Buch zu schreiben. Das kann gut gehen, muss aber nicht.
Und wenn du Form3 dynamisch erstellst, und evtl. sogar mehrfach, dann kann es richtig fies werden. Denn wenn im Create der Form ein neuer Thread gestartet wird, dann hast du nicht einen, der in deinem Buch mitschreibt, sondern mehrere...
ALF - So 25.07.10 15:23
Ok Super Antwort :zustimm:
Kongret heist das für mich!? Ich brauch also gar nicht den Thread in die dynamisch erstellten Form3 reinschreiben. Sondern es reicht aus, den in die MIDIFORM zu packen und dann aus der dynamisch erstellten MIDIChild(Form3) den Thread Aufrufen!
So wie Du es schon erwähnt hast (mit sychonize und Rückgabe der Arrays)!
Richtig !?
Wenn ja kann ich nur hoffen das ich das hinbekomme :?
Gruss ALf
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!