Entwickler-Ecke
Internet / Netzwerk - Indy9-client friert ein trotz Antifreeze
schippi - Mi 28.11.07 11:52
Titel: Indy9-client friert ein trotz Antifreeze
Hallo!
Ich benutze die Komponenten IdTCPServer und IdTCPClient von Indy 9.
Mein Client friert immer ein, wenn ich mehrmals nacheinander Daten an den Server schicke und der Server nicht gleich antwortet. Schickt der Server sofort eine Antwort zurück, friert mein Programm nicht ein. Anscheinend müsste das Problem ja bekannt sein, weil sonst würde man die Antifreeze-Komponente nicht benötigen. Aber mit dieser Komponente gehts trotzdem nicht... :?
Kann mir da jemand helfen??
Viele Grüße!
Narses - Mi 28.11.07 12:42
Moin!
Das Antifreeze-Gefrickel von den Indies ist eh Müll... :? Pack die Operationen in einen Thread und gut is das. :idea: ;)
cu
Narses
schippi - Mi 28.11.07 14:30
| Narses hat folgendes geschrieben: |
| Das Antifreeze-Gefrickel von den Indies ist eh Müll... Pack die Operationen in einen Thread und gut is das. |
Danke für den Tip. Jetzt friert zumindest mein Client nicht mehr ein. :) Jetzt bleibt aber mein Server in der Execute-Methode hängen. :(
Das passiert aber nur wenn der Server viele Daten bekommt und ein Weilchen zum verarbeiten braucht. Anscheinend stauen sich dann die Daten auf und der Server schmiert ab.
Gibts hierfür auch noch so ne einfache Lösung?
Quitzlinga - Mi 28.11.07 16:30
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure Form1.ServerExecute(AContext: TIdContext); var msg : string; context : TidContext; begin Msg := AContext.Connection.IOHandler.ReadLn(); ServerBatch.AddObject(Msg,AContext); if not ServerBusy then begin ServerBusy := true; Msg := ServerBatch.Strings[0]; Context := TIdContext(ServerBatch.Objects[0]); ServerBatch.Delete(0); ServerBusy := false; end; end; |
ServerBatch ist eine Liste vom Typ TList und wird im Hauptprogramm initialisiert. Funktioniert bei mir bestens und hat den Vorteil, das die Execute-Routine des Servers sich nicht aufstaut.
MfG
Qutizlinga
schippi - Do 29.11.07 15:04
@Quitzlinga: Hast du das so gemeint, dass du alle Daten die beim Server ankommen speicherst und dann einen Thread aufrufst in dem alles abgearbeitet wird?
Ich habs selbst noch nicht ausprobiert. Mach ich aber noch.
Aber mal was anderes. Eigentlich müsste doch das Ganze die Komponente für mich erledigen, so dass ich mich überhaupt nicht mit sowas befassen müsste. Das ist doch total benutzerunfreundlich. Warum empfiehlt bloß jeder Indy :gruebel: Wenn ich das vorher gewusst hätte, was da auf mich zukommt, wäre ich bei der guten alten TServerSocket-Komponente geblieben...
mfg
Quitzlinga - Fr 30.11.07 00:55
Das ich die Daten zwischenspeicher stimmt schon. Damit will ich nur verhindern, das die Execute-Routine des Servers mehrmals aufgerufen wird und mir so den Speicher vollmüllt. Es hat auch noch den weiteren Vorteil, das die Daten so abgearbeitet werden, wie sie ankommen. Im Normalfall möchte ich nämlich nicht, das der nächste Befehl abgearbeitet wird (lineare Abarbeitung), bloss weil der vorherige mehr Zeit zur Abarbeitung verbraucht und nicht rechtzeitig beendet werden kann und daher auf dem Stack landet,der vermutlich sehr begrenzt ist. Inbesondere beim zerstückelten versenden von Dateien darf nicht der nächste Teil verarbeitet werden, bevor der vorherige abgearbeitet wurde.
| Zitat: |
| Eigentlich müsste doch das Ganze die Komponente für mich erledigen, so dass ich mich überhaupt nicht mit sowas befassen müsste. |
Das macht die Komponente ja auch, aber sie ruft mit jeder Ankunft von Daten automatisch die Execute Routine auf. Sie wartet nicht solange, bis du den vorherigen Aufruf wieder verlassen hast.
| Zitat: |
| Warum empfiehlt bloß jeder Indy |
Das liegt daran, das die TServer und TClient Komponente von Borland nicht mehr unterstützt werden und nur noch der Vollständigkeit halber dabei sind. (Hab ich zumindest irgentwo mal gelesen). Weiterhin kommt noch eine gute Netzwerkstabilität hinzu und natürlich letztlich der Support zu den Indys.
| Zitat: |
| Wenn ich das vorher gewusst hätte, was da auf mich zukommt, wäre ich bei der guten alten TServerSocket-Komponente geblieben... |
Da hättest du genau dasselbe Problem gehabt (und wahrscheinlich noch ein paar mehr dazu)
MfG
Quitzlinga
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!