![]() |
AW: TIdTCPServer (Indy) und TClientSocket
Zitat:
Warum das so ist, verstehe ich trotzdem nicht so ganz.
Delphi-Quellcode:
sendet etwas ab, was z.B.
TClientSocket
Delphi-Quellcode:
auch ohne #13#10 empfangen würde. Dass ich mit
TServerSocket
Delphi-Quellcode:
auslese, ist korrekt. Aber das Ereignis
ReadLn();
Delphi-Quellcode:
wird nach meinem Verständnis ausgelöst, wenn Daten kommen.
OnExecute
Delphi-Quellcode:
weiß doch zu diesem Zeitpunkt noch gar nicht, wie ich was auslesen werde. Warum wird es ohne #13#10 nicht ausgelöst?
TIdTCPServer
Wenn mir jetzt noch jemand dieses - aus meiner Sicht - merkwürdige Verhalten erklären könnte, wäre das phönomenal. Danke aber auf jeden Fall an alle und insbes. Bambini - auf diese Lösung wäre ich nie gekommen! Gruß, Alex |
AW: TIdTCPServer (Indy) und TClientSocket
Zitat:
PS: Das OnExecute wird aus einem Thread aus gerufen, d.h. Zugriffe auf die UI (bei dir das TMemo) sind da gefährlich. Das sollte mit TThread.Synchronize(nil, ...) geschützt werden. |
AW: TIdTCPServer (Indy) und TClientSocket
Zitat:
Zitat:
Innerhalb eines Threads ist mir das klar. Da Du das weißt, hast Du vermutlich meinen Quellcode angeschaut. Dort habe ich die das Polling des
Delphi-Quellcode:
extra in einen Thread ausgelagert. Dann müsste ich ja eine eigene Klasse von
TIdTCPClient
Delphi-Quellcode:
reinbasteln. Das ist dann auch - gelinde gesagt - ungünstig, wenn man Objekte in die IDE integriert, ich als Laie denke, alles ist schick, und mir das dann um die Ohren fliegt ...
TIdTCPServer
Danke schon mal für den Hinweis. |
AW: TIdTCPServer (Indy) und TClientSocket
Zitat:
Zitat:
Delphi-Quellcode:
Procedure TForm1.IdTCPServerExecute(AContext: TIdContext);
Var Data:String; Begin Data:= AContext.Connection.Socket.ReadLn(); Data:= Trim(Data); TThread.Synchronize(nil, procedure() begin ScrollLog('[Srv]: received:'); ScrollLog('=> ' + Data); end); Zitat:
Zitat:
|
AW: TIdTCPServer (Indy) und TClientSocket
Danke nochmal für's Drüberschauen und die Erklärung.
Zitat:
Ich vermisse dann auch einen Compiler-Hinweis. Der "liest" ja den Code und sollte das wissen :lol: 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? ... Zitat:
Delphi-Quellcode:
In diesem Fall muss ich dann innerhalb des VCL-Teils kein Syncronize mehr benutzen, oder doch?
// 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; Ich bin jetzt etwas verwirrt. |
AW: TIdTCPServer (Indy) und TClientSocket
Zitat:
Zitat:
Daher ist es schon sehr gut, dass die für jeden Client im eigenen Thread läuft. Zitat:
|
AW: TIdTCPServer (Indy) und TClientSocket
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Kannst Du mir bitte einen Gefallen tun: Du schriebst weiter oben, dass bei Dir das Ereignis auch ohne #13#10 ausgelöst wird. Bei mir eben nicht. Am Quellcode kann es also (theoretisch) nicht liegen. Macht es Dir was aus, mit ggf. per PN oder so eine von Dir compilierte exe-Datei zuzusenden? Gruß, Alex |
AW: TIdTCPServer (Indy) und TClientSocket
Zitat:
Von "Außen" sieht man das nicht. Nur wenn du einen BreakPoint in das OnExecute beim begin setzt, also VOR dem ReadLn() und deinen String ohne CRLF schickt, solltest du es auch sehen. |
AW: TIdTCPServer (Indy) und TClientSocket
Zitat:
|
AW: TIdTCPServer (Indy) und TClientSocket
Zitat:
Delphi-Quellcode:
wird aufgerufen. Warum sehe ich dann wiederum keine Meldung; auch wenn ich die Ausgabe ganz an den Anfgang setze:
OnExecute
Delphi-Quellcode:
Procedure TForm1.IdTCPServerExecute(AContext: TIdContext);
Var Data:String; Begin ScrollLog('OnExecute();'); Application.ProcessMessages; Data:= AContext.Connection.Socket.ReadLn(); Data:= Trim(Data); // Sonder- und Leerzeichen entfernen TThread.Synchronize(nil, // threadsicherer VCL-Zugriff Procedure() Begin ScrollLog('[Srv]: received:'); ScrollLog('=> ' + Data); End); End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz