Autor Beitrag
Tobi482
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135



BeitragVerfasst: Di 30.10.07 15:46 
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.
ausblenden 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
     //DatenPaket auslesesn
     Data := Socket.ReceiveText;
end;

procedure Tmain.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
     Data      : String;
begin
     //DatenPaket auslesesn
     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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 30.10.07 16:30 
Moin!

user profile iconTobi482 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.

user profile iconTobi482 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Tobi482 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135



BeitragVerfasst: Di 30.10.07 17:29 
Frage schon beantwortet :)

DANKE

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
//Bleibt in der Schleife für z[ms]
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