Bonjour à tous,
Après avoir cherché pendant 2 jours sur internet sans succès (ou j'ai vraiment pas de chances) je me décide a poster un message dans l'espoir qu'une personne pourra me donner la solution.
Le système :
J'ai deux applis qui tournent sur des machines distinctes, l'une serveur et l'autre client.
Le serveur envoie régulierement et aléatoirement des infos au client qui permettent de mettre a jour une IHM sur l'évolution d'une plateforme robotisée. Le client est bloqué sur un readinteger pour obtenir la taille du stream a recevoir.
Lorsque le serveur est déconnecté je peux sans problème fermer le client. En effet les méthodes read, bloquantes, testent régulièrement la viabilité de la connection et lèvent une exception que je traite si on perd la connection.
Mon soucis est l'autre cas. C'est a dire quand le client veut se déconnecter alors que le serveur tourne toujours. Etant donné qu'il n'y a pas coupure de connection mon appli cliente est figé car le thread de réception ne se termine pas et reste bloqué sur le readinteger.
Voici le code de mon client :
Le code du serveur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 procedure TCycle.Execute; begin Connection; msg := 'Client connecté au serveur Frontal'; Synchronize(AddMessage); try while not Terminated do begin with Client do begin // Do your communication here try [b][color=orange]Size := ReadInteger;[/color][/b] // <-Bloqué ici si je ferme alors que le serveur tourne toujours ReadStream(MemStream,Size,False); MemStream.Position := 0; Synchronize(AddStream); except on E : EIdException do begin // On a perdu la liaison avec le Frontal, on relance la connection if not Terminated then begin msg := 'Connection perdue. Nouvelle tentative de connection'; Synchronize(AddMessage); Connection; end else begin Break; end; end; end; end; end; finally sleep(50); Deconnection; end; end;
Si une personne a la solution a mon problème je l'en remercie d'avance
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 procedure TMainForm.IdTCPServer1Execute(AThread: TIdPeerThread); var MemStream : TMemoryStream; TempStr : String; nb : integer; begin try with AThread.Connection do begin while cmdQueue.Count > 0 do begin MemStream := cmdQueue.items[0]; MemStream.Position := 0; WriteInteger(MemStream.Size); WriteStream(MemStream,True,False); CmdQueue.Delete(0); sleep(100); // Attente entre chaque envoi end; end; except end; end;
J'oubliais je suis sous D7 Pro avec Indy 9
Sylvain
Partager