2017-07-25 3 views
0

Dans mon application MFC, j'utilise un socket TCP/IP pour communiquer et obtenir des données d'un serveur. Pendant ce processus, j'affiche une boîte de dialogue sans texte avec contrôle du texte et de la progression. Je suis mise à jour le texte statique et le contrôle de progression dans un thread utilisateur distinct (AfxBeginThread). Si j'essaie de communiquer avec une adresse IP erronée, les sockets sélectionnent la fonction avec une valeur de temporisation de 5 secondes bloquant l'affichage du dialogue avec le texte statique et le contrôle de progression (si le dialogue se bloque, les contrôles sont affichés).Socket select() bloque les autres threads de l'interface utilisateur

Une fois que le support est sorti de la fonction sélectionnée, la boîte de dialogue s'affiche correctement.

Comment résoudre ce problème?

Répondre

0

Dans MFC, je voudrais fortement recommandons d'utiliser CAsyncSocket s, et de réagir juste lorsque les données proviennent du serveur. Vous n'avez probablement pas besoin de lancer un fil du tout.

Si vous deviez créer un thread séparé pour une partie du travail, vous souhaitiez affecter des tâches aux threads de manière légèrement différente. Vous voulez toujours laisser les mises à jour de l'interface utilisateur dans le thread principal (celui qui a été créé par défaut). Si vous utilisiez (par exemple) un socket bloquant et que vous appeliez select on, vous voudriez déplacer que travaille dans un thread séparé, et laisser les mises à jour de l'interface utilisateur dans le thread créé par défaut. Ensuite, le thread gérant le socket pourrait (par exemple) envoyer des messages au thread de l'interface utilisateur pour lui indiquer ce qui se passe, afin qu'il puisse mettre à jour l'interface utilisateur de manière appropriée. Mais, comme déjà noté, vous voulez probablement juste utiliser un CAsyncSocket, auquel cas vous n'aurez pas besoin d'un deuxième thread du tout.