Entwickler-Ecke
Internet / Netzwerk - OnExecute-Ereignis bei IdTCP Komponente
Jojojoxx - Do 10.01.08 23:32
Titel: OnExecute-Ereignis bei IdTCP Komponente
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:
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
Narses: Code- durch Delphi-Tags ersetzt
Xentar - Do 10.01.08 23:45
Wie die Fehlermeldung schon aussagt, kannst du dem Ereignis "OnExecute" nur eine Methode zuweisen:
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 - 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 - Fr 11.01.08 00:05
Jojojoxx 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 :)
Jojojoxx 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 - 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 - 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 - 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!