Also Gut, ich schaffs net alleine.
Es existiert eine Form mit einem Memo (meDebugLog).
Zur Laufzeit wird ein TServer Objekt erstellt und von draussen senden TCP Clients ihr Anfragen.
Bei jeder Anfrage eines Clients tritt das Ereignis OnExecute des TCP Servers ein, damit man da seinen Code reinhauen kann um zu reagieren und zu verarbeiten.
Soweit kein Probleme.
Hier der Code reduziert auf das wesentliche:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| TDebugEvent = procedure (Text: string);
TServer = class FTCPServer: TIdTCPServer; FOnDebug: TDebugEvent; private procedure HandleOnExecute(AThread: TIdPeerThread); procedure Debug(Text: string); public constructor create; property OnDebug: TDebugEvent read FOnDebug write FOnDebug; end;
constructor TServer.create; begin FTCPServer.OnExecute := HandleOnExecute; end;
procedure TServer.HandleOnExecute(AThread: TIdPeerThread); begin Debug('Debugmeldung...'); end;
procedure TServer.Debug(Text: string); begin if assigned(FOnDebug) then FOnDebug(Text); end; |
Das OnDebug Ereignis is dazu da, damit die Form die Debugmeldungen in das Memo schreiben kann.
Das klappt auch, solange nicht zu viele Clients gleichzeitig Anfragen senden.
Und meine Vermutung war, das es mit den vielen Threads zu tun hat, die gleichzeitig das Ereignis OnExecute auslösen, in dem wiederum das Ereignis OnDebug ausgelöst wird.
Edit:
OnExecute wird ja selbst aus einem Thread (TIdPeerThread) aufgerufen, ohne eine Critical Section zu benutzen.
Kann man eine Critical Section auch im Hauptthread (Formulare usw) erstellen und so alle anderen "echten" Threads blockieren?