Mon programme consomme beaucoup plus de temps CPU que je ne le souhaite (2 écrans le prennent jusqu'à 80-90%). J'utilise Qtimers, et certains d'entre eux sont aussi courts que 2ms. À tout moment, je peux avoir 12+ minuteurs par affichage - 2ms, 2ms, 2ms, 250ms, le reste entre 200ms et 500ms. Serait-il préférable que j'utilise des threads pour tout ou partie de ceux-ci (surtout les plus courts)? Cela ferait-il une grande différence?QTimer vs threads individuels
Répondre
Le problème principal de l'heure est celui des temporisateurs haute priorité. Tout d'abord, assurez-vous que vous en avez vraiment besoin toutes les 2ms, deuxièmement, pour surmonter les surcharges de la classe QTimer, vous pouvez regrouper vos 3 délais de 2ms en un, et chaque fois qu'il se déclenche, exécutez les 3 sections de code séquentiellement. Je ne pense pas que le filetage résoudra le problème.
Eh bien, ce taux de minuterie court est basé sur les vitesses de transfert RS-232 à 19200 bauds. Une minuterie pour la lecture, une minuterie pour l'écriture et une minuterie pour vérifier le tampon. La minuterie de 250 ms est pour les délais d'attente de réponse (l'affichage doit répondre dans ce délai). Le reste des minuteurs mettent à jour le texte d'affichage ou une autre opération. Je peux certainement combiner les trois minuteurs en un seul. – Scott
Ah, pas étonnant alors. Désolé, mais votre question ressemble vraiment à "Dois-je utiliser un tournevis normal ou Philips pour mettre un clou?". Non, vous avez besoin d'un marteau. Et dans ce cas, vous avez probablement besoin d'E/S pilotées par des interruptions. Votre classe de série Qt prend-elle en charge 'QIODevice :: readyRead'? – MSalters
Les coutures de 2 ms me semblent suspectes. Les gens ont lu et écrit des ports série à 19200 bauds pendant des années (par exemple sur du matériel 486) sans surcharger le cpu. Peut-être que votre approche est erronée.
Quelle API utilisez-vous pour accéder au port? J'ai l'impression que vous les interrogez, si l'API prend en charge les lectures bloquées et écrit cela serait une bien meilleure approche. Le plus simple serait alors de mettre la lecture et l'écriture dans leur propre thread, et d'utiliser des lectures bloquantes dans une boucle, alors votre thread ne sera occupé que s'il y a des données à lire et que vous le traitez. Votre application doit savoir quand elle doit écrire, donc le bon thread doit attendre sur une variable de condition, quand les données sont disponibles, cette condition est déclenchée pour réveiller le thread d'écriture. Il est probablement plus facile d'utiliser des approches monothread car je suis sûr que les premières applications à lire et à écrire sur les ports série (par exemple x modem) n'étaient pas multithread, mais je ne les connais pas mais elles devraient être documentées dans l'API que vous utilisez.
486? Je l'ai utilisé sur un 4.77 Mhz 8086. Il a aidé que mon PC avait l'UART 16550A avec des tampons de 16 octets; 19200 bauds sont environ 2000 octets par seconde, ce qui signifie que vous devez vider le tampon toutes les 8 ms. Et il est piloté par des interruptions, donc pas besoin de minuteries sophistiquées. – MSalters
Je n'ai pas eu un 16550A avant d'avoir mon 486, mon 386SX avait un 16550, même vitesse mais sans le buffer. – iain
- 1. Arrêt de threads individuels
- 2. Index individuels vs index de champs multiples
- 3. Threads vs Processus
- 4. Temps restant de QTimer
- 5. QPainter et QTimer
- 6. Problème de QTimer dans QGIS (Quantum GIS)
- 7. Windows, processus multiples vs threads multiples
- 8. .NET 4 Async WebRequest Vs Mutiple Threads
- 9. Qtimer ne temporise pas QT, C++
- 10. Boucle d'événements Qt/thread Requêtes QTimer/MySQL
- 11. ASP.NET MenuItem Styles individuels
- 12. imprimer des tableaux individuels?
- 13. Problèmes de temporisation QTimer avec QEventLoop et QNAM
- 14. Comment supprimer les avertissements individuels en C++?
- 15. TinyMCE: Activer les boutons individuels
- 16. Recherche de réseaux bipartites individuels
- 17. Rendez-vous et postes individuels
- 18. Stratégie d'évolution avec échelons individuels
- 19. preg_replace - tableau de remplacement individuels
- 20. Threads C# - Publication de messages entre threads
- 21. Stratégies d'expiration hiérarchiques sur des éléments individuels
- 22. Flex DateChooser événements pour les jours individuels?
- 23. Index de couverture ou index individuels
- 24. Sélectionnez XML individuels objets liés à TreeView
- 25. ASP.NET répéteur de contrôle - Référencer éléments individuels
- 26. affichage des pixels individuels dans WPF
- 27. Pouvons-nous valider des fichiers individuels?
- 28. Obtenir des objets JSON individuels avec Ruby
- 29. Téléchargement de fichiers individuels vers l'installation Appengine
- 30. Fonction jquery pour les div individuels
Vos discussions sont-elles très occupées, avec ces minuteries? Il peut exister d'autres moyens de conserver les threads actifs. – bua
bua: Eh bien, je n'utilise pas les threads directement. Si Qt les utilise derrière la scène, je ne suis pas au courant. J'avais l'impression que cela faisait simplement une boucle dans le fil principal et que tout le calendrier était là. – Scott
votre impression est correcte en ce qui concerne le fil principal. est-il possible pour vous d'annuler certains timers pour avoir une idée de ceux qui prennent du temps? Je ne pense pas que ce soit le nombre de minuteurs ou l'intervalle qui prend du temps, c'est plus probable que les choses que vous faites en eux. –