Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Terminer proprement un serveur

5 réponses
Avatar
Pierre Alexis
Bonjour,

Re-problème qui me turlupine depuis longtemps...

J'ai un thread principal (ma UI) qui lance un autre thread "Serveur"
chargé d'écouter sur le réseau. Pour ce faire, j'ai une boucle qui
effectue une lecture blocante et ce indéfiniment.

Comment faire pour que quand l'utilisateur ferme ma UI je puisse fermer
proprement le thread serveur ?

Est-ce que si je fais un Abort ça va marcher ? Comment faire alors pour
terminer proprement mon serveur et fermer convenablement mon socket ?

Bref un problème très courant somme toute ^^

Merci !

--
Pierre ALEXIS
Courriel : alexispierre@hotmail.com
FAQ Visual Basic : http://faq.vb.free.fr/

5 réponses

Avatar
Fred
"Pierre Alexis" a écrit dans le message de news:

Bonjour,

Re-problème qui me turlupine depuis longtemps...

J'ai un thread principal (ma UI) qui lance un autre thread "Serveur"
chargé d'écouter sur le réseau. Pour ce faire, j'ai une boucle qui
effectue une lecture blocante et ce indéfiniment.

Comment faire pour que quand l'utilisateur ferme ma UI je puisse fermer
proprement le thread serveur ?

Est-ce que si je fais un Abort ça va marcher ? Comment faire alors pour
terminer proprement mon serveur et fermer convenablement mon socket ?

Bref un problème très courant somme toute ^^

Merci !

--
Pierre ALEXIS
Courriel :
FAQ Visual Basic : http://faq.vb.free.fr/



Bonsoir,
Donc le serveur ne sert qu'un client ?
Dans une problématique un peu différente (plusieurs clients), j'ai évité les
appels blocants et utilisé un select.
Cela permet de savoir (dans une liste de sockets) lesquels ont reçu des
données, lesquels ont été fermés ...
Cela ne répond pas à ta question directement mais cela permet de sortir
proprement du thread.
Je ne sais pas si ma méthode est la meilleure. Peut-être un spécialiste du
réseau nous donnera-t-il son avis ?
Avatar
Pierre Alexis
Fred a écrit :

Dans une problématique un peu différente (plusieurs clients), j'ai évité les
appels blocants et utilisé un select.
Cela permet de savoir (dans une liste de sockets) lesquels ont reçu des
données, lesquels ont été fermés ...
Cela ne répond pas à ta question directement mais cela permet de sortir
proprement du thread.



Comment ?

Merci.

--
Pierre ALEXIS
Courriel :
FAQ Visual Basic : http://faq.vb.free.fr/
Avatar
Fred
"Pierre Alexis" a écrit dans le message de news:

Fred a écrit :

Dans une problématique un peu différente (plusieurs clients), j'ai évité
les appels blocants et utilisé un select.
Cela permet de savoir (dans une liste de sockets) lesquels ont reçu des
données, lesquels ont été fermés ...
Cela ne répond pas à ta question directement mais cela permet de sortir
proprement du thread.



Comment ?

Merci.

--
Pierre ALEXIS
Courriel :
FAQ Visual Basic : http://faq.vb.free.fr/



Comment cela permet de sortir proprement je suppose ?
Dans ma classe j'ai tout simplement un booléen qui me sert pour la boucle
"infinie" du thread.
Lorsque je veux "fermer" mon serveur, je mets ce booléen à faux et je fais
un Thread.Join
Je n'ai pas le code sous la main et je ne me rappelle plus des détails. On
en reparle lundi si tu veux.
Si le comment portait sur autre chose, alors je te propose de regarder
l'aide sur la méthode select du socket.
Je crois qu'il y a un petit exemple.
L'idée c'est de ne plus avoir d'appels blocants. Donc appeler les lectures
uniquement lorsque l'on est sûr qu'il y a quelquechose à lire.
J'ai regardé ton lien sur les sockets. Si tu as appliqué ce qui est dit j'en
déduis que tu as un thread par client (ce que je n'avais pas compris au
départ). Dans le principe que j'ai utilisé, il n'y a qu'un Thread, dans la
boucle duquel je teste d'abord s'il y a une demande de connexion, auquel cas
je réponds en créant un nouveau socket que je mets dans un ArrayList.
J'utilise ensuite mon ArrayList avec la méthode select pour obtenir deux
nouvelles listes, une avec les sockets qui ont des données en attente que je
traite, et une avec les sockets qui ont été fermés (de mémoire). Et je
boucle.
Avatar
Pierre Alexis
Fred a écrit :

L'idée c'est de ne plus avoir d'appels blocants. Donc appeler les lectures
uniquement lorsque l'on est sûr qu'il y a quelquechose à lire.



Certes, mais alors c'est ton "Select" qui est bloquant... Je suppose
donc que tu lui définis un "timeout" et que tu le "relances" après
chaque timeout en ayant vérifié la valeur de ton booléen. J'ai juste ? :-p

Merci et à lundi pour en reparler ;-) !

++

--
Pierre ALEXIS
Courriel :
FAQ Visual Basic : http://faq.vb.free.fr/
Avatar
Fred
"Pierre Alexis" a écrit dans le message de news:

Fred a écrit :

L'idée c'est de ne plus avoir d'appels blocants. Donc appeler les
lectures uniquement lorsque l'on est sûr qu'il y a quelquechose à lire.



Certes, mais alors c'est ton "Select" qui est bloquant... Je suppose donc
que tu lui définis un "timeout" et que tu le "relances" après chaque
timeout en ayant vérifié la valeur de ton booléen. J'ai juste ? :-p

Merci et à lundi pour en reparler ;-) !

++

--
Pierre ALEXIS
Courriel :
FAQ Visual Basic : http://faq.vb.free.fr/



Bonsoir,
Oui, le select est "bloquant" dans le sens où tu lui spécifies un nombre de
microsecondes d'attente avant de retourner. Quand tu parlais d'appel
bloquant, je suppose que tu faisais allusion au fait que l'exécution de ton
thread est figée si aucune donnée n'est disponible en lecture, d'où la
nécessité du abort. Ce n'est jamais le cas avec le select. Le délai n'est
pas un timeout, mais bien un temps de scrutation pendant lequel le select
prend en compte les éventuels changements.