Danke nochmal für's Drüberschauen und die Erklärung.
...
Dein Code sollte so aussehen: ...
Das isz jetzt zwar
OT: aber wenn ich das richtig deute, muss ich dann auch
VCL-Zugriffe
in allen TIdTCPServer-Ereignissen entsprechend absichern? Das ist ein ganz schöner Overhead, finde ich.
Ich vermisse dann auch einen Compiler-Hinweis. Der "liest" ja den Code und sollte das wissen
Ich habe in meinem Thread das Ereignis aus dem Thread heraus threadsicher (hoffe ich) aufgerufen. Warum machen das die Indys nicht gleich so? Und was mache ich, wenn die Prozeduren größer als eine klitzekleine Ausgabe in der
GUI werden? ...
Ich will nur sagen, dass das OnExecute() from TidTCPIPServer von einem Thread aus gerufen wird. Das macht die Komponente schon ganz alleine. Jedoch muss man dann aufpassen, das deine Code dann Threadsicher ist. D.h. Zugriffe auf Globale Variablen und UI sind zu synchronisieren (s.o.)
Aber dass das Ereignis aus einem Thread aufgerufen wird, macht es doch nicht automatisch thread
unsicher, wenn es sauber programmiert wurde. Ich dachte immer, so wäre es richtig und alle schlauen Ersteller von Komponenten würden das so (richtig) machen:
Delphi-Quellcode:
// Völlig ungetestet zusammengeschrieben, um die Frage zu verdeutlichen!!!
type
TfoobarEvent = procedure (Value: Integer) of object;
foobar = class(TThread)
private
FValue : Integer;
FOnErgebnis : TfoobarEvent
Procedure FireThreadSafe;
protected
procedure Execute; override;
public
property OnErgebnis: TfoobarEvent read FOnErgebnis write FOnErgebnis;
end;
implementation
procedure foobar.FireThreadSafe;
Begin
if Assigned(FOnErgebnis) then FOnErgebnis(FValue);
End;
procedure foobar.Execute;
begin
while not Terminated do
begin
FValue:= Random(5000);
if (FValue = 0) then Synchronize(FireThreadSafe);
end;
end;
In diesem Fall muss ich dann innerhalb des
VCL-Teils kein Syncronize mehr benutzen, oder doch?
Ich bin jetzt etwas verwirrt.