Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#3

AW: Allgemeine Fragen zu Theads

  Alt 25. Jan 2017, 14:35
Überall heißt es man soll aus Threads nicht direkt auf Form-Elemente zugreifen. Hier wird es doch gemacht. Also doch kein Problem wenn sicher ist dass kein anderer auf Form1.Memo1 zugreift?
Das ist so nicht richtig. Korrekt müsste es heißen: "wenn sicher ist, dass kein anderer auf die VCL zugreift", aber das kannst du einfach nicht sicherstellen, wenn das nicht im Hauptthread abläuft. Hintergrund: die VCL kapselt die Winapi-Zugriffe und legt dafür dynamisch die benötigten Handles an, sobald sie gebraucht werden. Da es sich hierbei auch schon mal um globale Variablen oder Objekte handelt, ist eine Verwendung in getrennten Threads potentiell tödlich für die Anwendung. Deswegen die Maßgabe: alle Zugriffe auf die VCL ausschließlich aus dem Hauptthread heraus!

Im Execute greife ich auf die globale Liste MyList zu. Muss ich die zwingend mit System.TMonitor.Enter sperren wenn ich nur lesen will?
Solange die Liste überhaupt nicht verändert wird, sollte das Lesen funktionieren. Sobald aber irgendwer eventuell eine Änderung machen könnte, ist das nicht mehr der Fall.

Was kann passieren wenn ich nur Werte hinzufüge?
Sobald dabei mehrere Threads beteiligt sind (Lesen und/oder Schreiben) muss synchronisiert werden. Beim Schreiben kann es vorkommen, daß der der Speicher neu alloziert wird. Davon wäre auch ein Lesen betroffen.

Was wenn sich auch Werte ändern könnten?
Da auch hier keine atomare Operation angenommen werden kann, ist ein Synchronisieren notwendig.

Obwohl ich MyThread.FreeOnTerminate := true; gesetzt habe funktioniert die Assign-Abfrage in procedure TForm1.Button2Click(Sender: TObject) . Setze ich einen Haltepunkt nach dem Terminate ist MyThread nicht NIL.
Das Free gibt ja auch nur die Instanz frei, setzt aber deine Variable nicht auf nil.

Die Anwendung wirft in der IDE eine Exception wenn in FormClose MyThread.Terminate; nicht aufgerufen wird. Muss ich beim Beenden sonst noch was beachten?
Siehe oben.

Greift man innerhalb einer Klasse besser auf die Variable oder das Property zu (FSleepTime oder SleeptTime)?
Das ist in diesem Fall Geschmackssache.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat