Tobi482 - Di 30.10.07 15:46
Titel: Threadverhalten von TServerSocket/TClientSocket
Hi Leute,
ich habe eine einfache frage zu den TServerSocket/TClientSocket Komponenten in Delphi7.
Jede der beiden Komponten hat ein OnEvent Methode, die beim Empfang von Daten ausgelöst wird.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure Tmain.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket); var Data : String; begin Data := Socket.ReceiveText; end;
procedure Tmain.ClientRead(Sender: TObject; Socket: TCustomWinSocket); var Data : String; begin Data := Socket.ReceiveText; end; |
In meinem Fall beinhaltet jede der beiden Methoden eine Procedure deren Komplexität in Zeit und Speicher von den erhaltenen Daten abhängt. Diese Procedure trägt auch Informationen in Array ObjectListen und anderen Varaibalen ein.
Die Datenpakete kommen sehr schnell hintereinander wobei es zu Fehler kommt. Ich konnte die Fehler soweit zurück debuggen, dass es Fehlstellen in den Listen gibt.
1. Paket (Ankunft nach 00ms) (Auftrag: Erstelle Object A)
2. Paket (Ankunft nach 10ms) (Auftrag: Bearbeite Object A)
Das erstellen von Object A, was durch das erste Paket ausgelöst wird dauert aber ca. 140 ms. Soweit ich das sehe, führt Delphi aber bevor das erste OnRecv komplett durchgelaufen ist schon parallel ein zweites OnRecv aus, genau in dem moment wenn Paket 2 eintrifft.
(Stimmt das?)
Die Funktion GetObjectFromList(A) findet Object A aber noch nicht, weil das erstellen und eintragen in die Liste länger dauert.
Wie kann ich den Zugriff auf meine Procedure(die, die die Pakete verarbeitet) so ändern, dass die OnRecv Threads warten bis der jeweils vorherrige Durchlauf beendet ist?
Mit freundlichen Grüßen
Tobi
Narses - Di 30.10.07 16:30
Titel: Re: Threadverhalten von TServerSocket/TClientSocket
Moin!
Tobi482 hat folgendes geschrieben: |
Soweit ich das sehe, führt Delphi aber bevor das erste OnRecv komplett durchgelaufen ist schon parallel ein zweites OnRecv aus, genau in dem moment wenn Paket 2 eintrifft.
(Stimmt das?) |
Nein, das stimmt (normalerweise) nicht. Ausnahmen: du rufst im Ereignishandler
Application.ProcessMessagesauf oder (nur im
TServerSocket) du verwendest eine eigene ClientThread-Klasse, die du über das entsprechende Ereignis zur Verfügung stellst, und diese erlaubt dieses Verhalten.
Tobi482 hat folgendes geschrieben: |
| Wie kann ich den Zugriff auf meine Procedure(die, die die Pakete verarbeitet) so ändern, dass die OnRecv Threads warten bis der jeweils vorherrige Durchlauf beendet ist? |
Zunächstmal scheint es mir besser, wenn du dir mal den
IdTCPServerund
IdTCPClientvon den Indies anschaust. :idea:
Ansonsten kann man schlecht was sagen, ohne den Code im Ereignishandler gesehen zu haben. :nixweiss:
cu
Narses
Tobi482 - Di 30.10.07 17:29
Frage schon beantwortet :)
DANKE
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Procedure WaitForMs(z:DWORD); var s : Integer; begin s := GetTickCount; while GetTickCount < s+z do begin Application.ProcessMessages; end; end; |
Genau das ist der fehler habs den teil raus genommen. Jetzt hängt die oberfläche zwar manchmal etwas aber es treten keine fheler mehr auf :)
Danke