Autor Beitrag
Jojojoxx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 386



BeitragVerfasst: Do 10.01.08 23:32 
Hi!

Ich beschäftige mich gerade mit der Indy TCP Komponente.
Soweit habe ich verstanden, dass ich der Serverkomponente ein OnExecute Ereignis zuweisen muss, das nach Connect ausgeführt wird. Leider missling mir das mit diesem Testcode:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure ServerExecute(AThread: TidPeerThread);
begin
 showmessage('test');
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
 TCPServer.OnExecute:=ServerExecute;
 TCPServer.Active:=True;
end;


Die Fehlermeldung ist "Inkompatible Typen: Methodenzeiger und Reguläre Prozedur".
Was mache ich falsch?
Danke euch für die Hilfe!
mfg

Jojo

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Do 10.01.08 23:45 
Wie die Fehlermeldung schon aussagt, kannst du dem Ereignis "OnExecute" nur eine Methode zuweisen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.ServerExecute(AThread: TidPeerThread);
begin
 showmessage('test');
end;

Hat was damit zu tun, dass Methoden (also Prozeduren in einer Klasse) einen unsichtbaren Parameter "self" mitbringen. Deswegen sind diese Methoden "größer" als normale Prozeduren.

Übrigens solltest du nochmal die Verwendung von OnExecute nachlesen - deine ShowMessage dürfte ziemlich oft angezeigt werden ;)
Jojojoxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 386



BeitragVerfasst: Do 10.01.08 23:57 
Hi!

Ja, so klappt´s! :-)
So wie ich es verstanden habe, wird das OnExecute Ereignis wiederholt zwischen OnConnect und OnDisconnect. Deshalb war mir schon klar, dass das zu sehr vielen showmessage-Fenstern kommt ;-)

Aber kannst du mir erklären, weshalb ich dann dieses Ereignis brauche, wenn ich nicht dauerhaft Code ausführen will zwische OnConnect und OnDisconnect. Ich will nur Code ausführen nach OnConnect/OnDisconnect und wenn ein String gesendet wird.
Danke!
mfg

Jojo
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Fr 11.01.08 00:05 
user profile iconJojojoxx hat folgendes geschrieben:
So wie ich es verstanden habe, wird das OnExecute Ereignis wiederholt zwischen OnConnect und OnDisconnect. Deshalb war mir schon klar, dass das zu sehr vielen showmessage-Fenstern kommt ;-)

OK, dann hast du es richtig verstanden :)

user profile iconJojojoxx hat folgendes geschrieben:
und wenn ein String gesendet wird.

Jo, dafür wird das verwendet ;)
OnExecute wird immer wieder für jeden verbundenen Client aufgerufen. In der Behandlung von OnExecute kannst du dann also z.B. Daten empfangen und auswerten.
Jojojoxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 386



BeitragVerfasst: Fr 11.01.08 00:14 
Aber dann befindet sich doch das Programm in einer Dauerschleife --> 100% CPU.
Oder verstehe ich da irgendwas falsch :(
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Fr 11.01.08 00:56 
Nein, tut es nicht ;)

Also: Für jede Verbindung, die der Indy TCP Server hält, wird ein neuer Thread abgespalten. D.h. dass jede Verbindung in einem eigenen Thread läuft. Das OnExecute, was man verwendet, ist das Execute Event all' dieser Threads. Wenn du in diesem Event "nichts" machst, schläft der THREAD, nicht aber die Anwendung -> 0% CPU Last.

Ganz nebenbei: Wenn du in diesem OnExecute auf Formularkomponenten zugreifst, musst du dich um die Synchronisierung (oder heißt es Synchronisation? *grübel*) kümmern.

Der Vollständigkeit halber:
Der TCP Server hat auch noch einen eigenen Thread, den sogenannten ListenerThread. Dieser ist nur dazu da, eingehende Verbindungen entgegen zu nehmen.


soweit verstanden?
Jojojoxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 386



BeitragVerfasst: Fr 11.01.08 01:08 
Achso! :-)
Das habe ich soweit verstanden, aber ich glaube ich muss mich mal intensiver mit Threads auseinandersetzen, damit habe ich noch nicht wirklich was gemacht.
mfg

Jojo