2017-01-16 2 views
0

J'écris une application de bureau QT qui va afficher des informations reçues à partir d'un port série. Par conséquent, une classe a été créée et compressée dans une DLL à l'aide des fonctionnalités standard de l'API Windows pour communiquer avec le périphérique connecté (CreateFile, ReadFile, WriteFile, ...). Au moment où un temporisateur appelle la DLL à un débit prédéfini [< 200ms], l'interface se bloque pendant de courtes périodes. Pour cette raison, je pense à utiliser un thread pour faire le port série, cela va aussi tout afficher.communication de port série à threads en C++ avec Qt

Est-il préférable d'utiliser des threads pour ce problème ou devrais-je réécrire la classe pour faire l'événement de travail basé? La cible est, que le gui ne gèle pas. J'ai résolu le problème en utilisant une classe de travail dérivée QThread avec une fonction run() ombragée, qui gère la communication du port série en arrière-plan et met à jour le GUI lorsque de nouvelles informations sont disponibles.

+1

Y a-t-il une raison pour ne pas utiliser ['QSerialPort'] (https://doc.qt.io/qt-5/qserialport.html#details)? – Mike

+0

'QSerialPort' fait déjà le travail de communication asynchrone avec un port série. L'utilisation de threads pour une telle tâche fonctionnera si votre but est de ne pas geler l'interface graphique, mais c'est une exagération. L'approche asynchrone fonctionne mieux avec Qt, et elle est beaucoup plus facile à maintenir. – Mike

+0

Lorsque le projet a été démarré, nous n'allions pas utiliser qt. Donc, nous avons commencé en utilisant seulement les fenêtres api – Aeonos

Répondre

0

Dans de nombreux cas d'utilisation, il est recommandé d'effectuer toutes les E/S (synchrones) de blocage sur un thread distinct, en particulier lorsqu'une interface utilisateur graphique est impliquée. Here's a page I've referenced en ce qui concerne les défis avec les E/S synchrones (par opposition à asynchrone où votre code ne bloque pas, mais est toujours mono-thread, ou parallèle que vous discutez). Il y a plus de problèmes que simplement ce que vous avez soulevé, par exemple:

  • Et s'il n'y a pas de données disponibles? L'interface graphique bloque-t-elle jusqu'à ce qu'il y ait des données? Par exemple, si l'expéditeur était éteint, il n'y aurait pas de données
  • Que fait le programme si le périphérique d'E/S n'est plus disponible? Par exemple, s'il s'agit d'un adaptateur USB-série, que se passe-t-il si l'adaptateur est débranché?
+0

Merci pour l'article. C'était très utile. Je vais essayer std :: thread pour résoudre le problème. Si les données ne sont pas disponibles, la DLL renvoie une erreur et elle est enregistrée dans l'interface graphique. S'il est débranché, un message d'erreur s'affichera également. J'ai pris soin de ces possibilités avant cela ;-) – Aeonos

+0

Comme d'autres commentateurs l'ont suggéré: il existe des façons standard de faire cela dans QT, vous devriez considérer leurs approches. Le lien ne fait que discuter des paradigmes. À moins que vous n'essayiez juste d'apprendre le threading pour le plaisir. –