Einzelnen Beitrag anzeigen

Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#2

AW: Erste Schritte Multi-Threading

  Alt 11. Okt 2023, 07:26
Moin...

Ich fange mal an...
Zitat:
Ich habe doch mit einer globalen Variable gearbeitet
...genau deshalb (u.a.) sind die globale Variablen so verpönt.
Zitat:
Wie ist das möglich? Was für ein Thread wird denn da erzeugt?
Du erzeugst eine Thread und legst ihn in die Variable ab. Das ist alles.
ABER: Du tauscht nur den Pointer auf den Thread IN der Variable aus.
Sinnbild:
1. Tasse mit Teebeutel = Thread in der Variable
2. neuer Teebeutel soll in die Tasse = Erzeugung Thread
3. Teebeutel in der Tasse wird auf den Tisch gelegt und der neue Teebeutel kommt in die Tasse.
-> beide Teebeutel existieren. Die Tasse kennt aber nur den Teebeutel in der Tasse.
Zitat:
Wie kann ich einen Thread ansprechen, der zur Laufzeit erzeugt wurde?
Das betrifft auch den obigen Teil. Jeder Thread ist quasi nur ein Pointer in der Variable.
Die Lösung: Verwalte deine Threads in Listen oder Dictionaries (je nach Anwendungsfall). Dann kannst du dir den Thread aus der Liste wieder in eine Variable "laden" und kannst dann damit arbeiten. ...fertsch.
https://docwiki.embarcadero.com/Libr...es.TThreadList

Delphi-Quellcode:
Synchronize(procedure
                  begin
                     Form1.Write_Uhr(Now());
                  end);
Synchronize ist ja soweit ok.
Für die Zukunft aber:
Die Threads sollten eine eigene Unit haben. Der Thread und die Thread Unit, dürfen die Anwesenheit der Form NICHT kennen. Dem Thread muß egal sein was dann passiert.
Thema Wiederverwendbarkeit und zirkuläre Aufrufe.
Lösung:
Im Synchronize mit Events Arbeiten. Das aufrufende Objekt, in deinem Falle die Form, nimmt das Event entgegen und macht in ihrem "Bereich" das was zu zun ist: Write_Uhr(Now)
Beispiel:
Delphi-Quellcode:
Synchronize(procedure
                  begin
                     if Assigned(FOnChangeTime) then
                     begin
                       FOnChangeTime(Self);
                     end;
                  end);
PS:
Bitte vermeide Denglisch. Das tut an den Augen weh.
TH_Eins: TMyThread_Eins; besser
Delphi-Quellcode:
THOne: TMyThreadOne;
...
Bitte keine Unterstriche sondern CamelCase https://de.wikipedia.org/wiki/Binnen...ammiersprachen
Bitte gebe deinen Componenten, auch zum Testen, von Anfang an sprechende Namen. Form1 ist
Miniaturansicht angehängter Grafiken
unterstrich.png  

Geändert von haentschman (11. Okt 2023 um 08:36 Uhr)
  Mit Zitat antworten Zitat