Ich weiß der Andreas hat da auch was. Aber ich will auch mal!
Ich habe eine weitere Möglichkeit zusammengebaut um einen Thread (A) mit einem Thread (B) zu snychronisieren. Dies geht aber nur ausschließlich dann, wenn der Thread A von Thread B aus gestartet wurde. Weitere "Quersynchronisationen" sind nicht möglich. Gedacht ist es um einfach einen speziellen Thread mit dem Mainthread zu synchronisieren. Dabei wurde dieser spezielle Thread auch vom MainThread gestartet. (Ich hoffe soweit ist alles klar)
In der
Unit im Anhang liegt die Klasse TThreadEx, welche von TThread abgeleitet ist. Die Anwendung erfolgt über die beiden Methoden
StopMainThread und
ContinueMainThread:
Delphi-Quellcode:
//alles wie gehabt bei TThread:
type TmyThread=class(TThreadEx)
protected
procedure Execute; override;
...
end;
...
procedure TmyThread.execute;
begin
...
stopmainthread; //Hier wird der MainThread angehalten und man kann auf Variablen etc. des Mainthreads zugreifen
try
form1.memo1.lines.add('Hallo MainThread');
finally
continuemainthread; //und jetzt darf der MainThread auch wieder weitermachen
end;
...
end;
Was sind die Vorteile gegenüber synchronize:
- man braucht nicht diesen umständlichen Aufruf von Synchronize, bei dem keine Variablenübergabe möglich ist
- diese Variante funktioniert auch in einer DLL (synchronize nicht)
Es war einfach eine Idee von mir, die ich mal ausprobieren musste. Bei meinen Versuchen klappt es ohne Probleme.
Edit 1+2: neue Version, jetzt würde der Mainthread auch bei einem plötzlichen Ende (
Exception, Error) des SubThreads weiterlaufen
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.