Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

AW: Exception ohne wirklichen Auslöser treibt mich in den Wahnsinn!

  Alt 20. Aug 2013, 17:10
Ich habe dieses Thema seit Bestehen auf meiner "Muss ich mir näher anschauen und nicht nur überfliegen"-Liste, bislang ist das nicht geschehen. Deswegen nur eine Reaktion direkt auf den den letzten Beitrag, ohne die ganze Geschichte zu kennen:

Zitat:
1) Mit dem Main-Thread darf man niemals auf Thread-Variablen zugreifen -weder lesend noch schreibend- die jemals im Thread.Execute verwendet werden
Meinst du mit "Thread-Variablen" lokale Variablen in deiner Execute-Prozedur? Oder Felder deiner von TThread abgeleiteten Klasse?

Ich finde du machst es dir unnötig kompliziert. Es gibt zwei eiserne und einfache Regeln:
  1. Zugriff auf die VCL-Dinge darf nur vom Hauptthread aus geschehen.
  2. Wenn sich mehrere Threads für die gleichen Daten interessieren, müssen diese geschützt werden

Das war's. Zur weiteren Erläuterung:

1) Du bist standardmäßig immer im Hauptthread. Ausnahmen sind die Execute-Methode einer TThread-Klasse und beispielsweise die entsprechenden "Behandle Netzwerkpaket"-Handler von Serverkomponenten wie Indy.

2) Schützen bedeutet: Sicherstellen, dass niemand die Daten lesen (oder ändern) kann, während jemand anderes gerade am ändern ist.

Für reine Variablen bieten sich TMultiReadExclusiveWriteSynchronizer (was für ein Klassenname) perfekt an. Erstelle dir einen (oder mehrere), und bevor du eine Variable ändern willst, sage "mutex.beginRead();". Wenn du fertig gelesen hast, sag "mutex.endRead();". Ebenso mit dem Schreiben.

Parallel gibt es kritische Abschnitte, die Delphi Klasse TCriticalSection kapselt hier eigentlich schon alles was man braucht.

Ich würde vielleicht nicht einmal ein konkretes technisches Tutorial, wie man Threads in Programmiersprache XY hinbekommt, sondern etwas theoretische Grundlagen lesen. Ich habe gerade leider keinen Vorschlag parat, aber vielleicht jemand anderes.

Es tut niemandem weh, wenn du bsp. im VCL-Thread "Objekte benutzt", die in einem anderen erstellt wurden. Niemandem tut es weh, wenn mehrere Threads gleichzeitig die gleiche Methode auf einem einzigen Objekt aufrufen, und dieses Objekt in einem Thread erstellt wurde, der schon längst tot ist. Es sind eigentlich nur diese beiden Regeln.

Geändert von Der schöne Günther (20. Aug 2013 um 17:14 Uhr)
  Mit Zitat antworten Zitat