7
votes

Fil à 100% CPU très vite

Je suis en train de mettre en place un thread très basique en C #: xxx

puis j'obtiens immédiatement 100% de la CPU. Je souhaite vérifier si les données de capteur sont lues à l'intérieur de la boucle (vraie). Pourquoi c'est comme ça?

Merci d'avance.


2 commentaires

Pouvons-nous supposer qu'il existe en réalité une implémentation dans la boucle pendant et qu'elle a une certaine capacité à se terminer?


Obtenir 100% CPU est correct selon ce code. Y a-t-il un intervalle que vous souhaitez vérifier les données du capteur? Vous devrez probablement dormir le fil en conséquence.


5 Réponses :


15
votes

tandis que (vrai) est ce qui tue votre CPU.

Vous pouvez ajouter thread.sleep (x) à vous pour donner au CPU du repos avant de vérifier à nouveau.

Aussi, on dirait que vous avez réellement besoin d'une minuterie.

Regardez l'une des classes de minuterie ici http: // msdn.microsoft.com/en-us/library/system.threading.Timer.aspx .

Utilisez la minuterie avec un intervalle de tirage élevé que vous pouvez vous permettre, 1 seconde, une demi-seconde.
Vous devez échanger entre l'utilisation de la CPU et le délai maximum que vous pouvez vous permettre entre chèques.


3 commentaires

Salut. Merci. Mais alors comment puis-je attendre que les données arrivent? Je voudrais vérifier continuellement les données à venir.


À quelle fréquence devez-vous vérifier de manière réaliste? Même le laisser dormir pendant 10 ms fera une énorme différence.


@Joesyxhn - D'où vient vos données?



2
votes

Laissez votre boucle dormir . Ça cource et autour et se fatigue. À tout le moins, laissez-le prendre un pause éventuellement.


2 commentaires

Devrais-je utiliser: Timer.Tick par 1 milliseconde au lieu d'utiliser le fil avec tout en boucle et dormir pendant 1 milliseconde?


Bahahahahahahahaha! 1 milliseconde! Essayez 100-500 millisecondes.




2
votes

Parce que votre fonction ne fait rien à l'intérieur du bloc tandis que celui-ci attrape la CPU et, à toutes fins pratiques, ne l'enlève jamais, d'autres threads peuvent faire leur travail xxx < P> Si vous le changez à ce qui suit, vous devez voir une consommation de processeur plus raisonnable: xxx


0 commentaires

0
votes

Si vous interrogez pour une condition, faites définitivement comme d'autres suggérées et mettez-les en sommeil. J'ajouterais également que si vous avez besoin de performances maximales, vous pouvez utiliser un astuce statistique pour éviter de dormir lorsque les données du capteur ont été lues. Lorsque vous détectez que les données du capteur sont inactifs, disons, 10 fois de suite, puis commencez à dormir sur chaque itération à nouveau.


0 commentaires