2009-10-30 7 views
0

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

+0

Vos discussions sont-elles très occupées, avec ces minuteries? Il peut exister d'autres moyens de conserver les threads actifs. – bua

+0

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

+0

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. –

Répondre

2

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.

+0

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

+3

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

1

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.

+0

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

+0

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