Bon, après mûre reflexion, j'ai trouvé une quatrième solution qui me convient mieux :
j'ai hérité la Classe TIdTCPClient en ajoutant les attributs, methodes et propriétés propres à mon composant.
Pour la lecture dans la socket, j'ai créé un thread qui tourne en boucle (avec une pause à chaque boucle pour ne pas bouffer trop de cpu) et notifie un évenement à son parent (mon composant) lorsque des données ont été envoyées par le serveur.
Je pense que c'est comme ça qu'il faut procéder.
En tout cas, c'est comme ca que fonctionnent les composants Indy qui implémentent des protcoles basés sur tcp (exemple : TIdTelnet).
Le seul doute qui me reste c'est la façon dont il faut s'y prendre pour vérifier si le serveur à envoyé des données :
dans la boucle de mon thread (décrit ci-dessus) je fais le test suivant :
1 2 3 4 5 6 7 8 9 10
| if (AslskClient.CurrentReadBufferSize=0)
then
begin
sleep(100);
end
else
begin
if(Assigned(FOnDataAvailable))
then OnDataAvailable(Self);
end; |
ce if est dans une boucle
while (not Self.Suspended)
et ASlskClient représente mon composant propriétaire du thread.
Le problème, c'est que ça ne marche pas super bien : l'évenement OnDataAvailable est bien lancé lorsqu'il faut, mais lorsque rien ne se passe l'éxécution du thread bloque toute l'appli
Est-ce que c'est bien CurrentReadBufferSize que je dois employer ? ou y-a-t-il un meilleur moyen de vérifier l'arrivée des données dans la socket ?
Merci d'avance
Partager