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 :


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;
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
 
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;
Si une personne a la solution a mon problème je l'en remercie d'avance

J'oubliais je suis sous D7 Pro avec Indy 9

Sylvain