Autor Beitrag
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: So 25.07.10 13:55 
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

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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.

_________________
We are, we were and will not be.
ALF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: So 25.07.10 14:50 
Danke erst mal für die Erklärung!
user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
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

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!


Zuletzt bearbeitet von ALF am So 25.07.10 15:02, insgesamt 1-mal bearbeitet
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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...

_________________
We are, we were and will not be.
ALF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: 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

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!