Comment limiter l'utilisation du PROCESSEUR dans une boucle while
Comment limiter le CPU d'une boucle while?
Dans ce cas, le code qui est à l'intérieur de la boucle while:
Private Sub wait(ByVal time)
Dim sw As New Stopwatch
sw.Start()
Do While sw.ElapsedMilliseconds < time And StillOpen = True
Application.DoEvents()
Loop
sw.Stop()
End Sub
Mais maintenant, ici, est le problème. Cette boucle permet à la boucle while pour exécuter chaque seconde, une fois par seconde, et la wait
sous-marin est à l'origine de ce retard, comme il se doit.
Comment puis-je limiter le CPU que c'est? Pour une raison quelconque, mon gestionnaire de tâches, dit-il en prenant 50 Processeurs pour exécuter cette tâche simple, mais il devrait probablement pas prendre plus de 1 ou 2. Bien que le manager dit qu'il prend beaucoup de CPU, ma vitesse de l'ordinateur n'est pas affectée, ce qui est étrange, compte-tenu qu'il est un deux-année-vieux portable.
Je ne veux pas à tous les utilisateurs de paniquer à ce sujet, mais de savoir comment les gens ces jours-ci....
De toute façon, la langue est vb.net. Quelqu'un peut-il m'aider?
Merci!
EDIT: Pour préciser, que le code n'est pas à l'intérieur de la boucle while lui-même, mais un appel à la sous-routine est, c'est à dire wait(1000)
- Refactoriser. Sérieusement, il y a bien mieux construit là-bas: waithandles, rappels, etc.
- Donner un exemple de code s'il vous plaît?
- Quel est le contexte de ce code est utilisé dans?
- alors que i < 100000000000 attendre(1000) Run() Fin tant que
- Et d'insérer des retours à la ligne (où ils doivent aller 😉
- "alors que i < 100000..." bloc est un très inhabituel, non-idiomatiques construire. Pourquoi tu fais ça? Ce comportement que vous souhaitez atteindre? Sachant que, il y a probablement une meilleure conception globale, nous pouvons vous suggérer.
- Je suis en train de boucler indéfiniment, tout simplement. Que suggéreriez-vous-je faire? Je comprends que c'est un idiot façon de le gérer, mais il fonctionne plutôt bien.
- Est-ce un riche d'application avec une interface graphique? La norme technique est d'utiliser Windows boucle d'événements, et de répondre à des événements que l'utilisateur génère. En fait j'ai été à la recherche pour plus de détails sur ce que votre application ne ("mise à jour de sprites ennemis à chaque seconde; répondre immédiatement si l'utilisateur appuie sur une touche") que la comment il le fait ("boucle pour toujours"). Presque chaque programme interactif là boucles pour toujours.
- J'ai à peine l'appeler riche lol. En effet, son principe est basé sur le fait qu'il n'existe AUCUNE interaction de l'utilisateur avec le premier événement, à tous. L'utilisateur peut contrôler la façon dont elle apparaît à eux, mais ils ne peuvent pas contrôler. C'est basé sur le populaire jeu par navigateur "IdleRPG", à l'exception, sans la partie rpg un peu.
Vous devez vous connecter pour publier un commentaire.
Utiliser une minuterie événement !!! Presque pas de cpu effort.
Vous pouvez toujours effectuer une sorte de sommeil entre les itérations de la boucle...
Je ne suis pas familier avec VB.NET mais une durée de 100-200ms sera peut-être plus que suffisante pour abandonner l'utilisation de l'UC.
Par exemple:
Modifier Après quelques recherches, je pense que la fonction que vous voulez est: System.Le filetage.Fil de discussion.Sleep()
Votre code est en cours d'exécution de l'Application.DoEvents() constamment dans la boucle while, pour la durée de temps spécifiée dans votre
time
paramètre. Cela permettra de consommer un seul core de votre CPU, qui est pourquoi on voit de plus de 50% d'utilisation du processeur (vous avez un processeur dual-core, correct?). C'est un vilain moyen d'attendre. Vous pourriez appeler plutôt Thread.Sleep(), en lui passant le nombre de millisecondes que vous aimeriez que votre fil d'attendre.Si vous souhaitez que votre demande de rester réactif, vous pouvez également le spin-off d'une minuterie, et de bloquer l'INTERFACE utilisateur de toute action jusqu'à ce que la minuterie se déclenche. Quelque chose comme (légèrement testé):
Voici ma tentative de traduction en VB:
Bien, le CPU est toujours à 100% quand il est en cours d'exécution, de sorte que le seul moyen pratique pour limiter l'utilisation du PROCESSEUR est de lancer des rafales ou de boucle et de dormir entre les deux.
Des Processeurs d'ordinateurs portable ont généralement peu de la technologie SpeedStep ou equievalent qui va ralentir le CPU quand il ne travaille pas dur, mais il n'est pas raisonnable de supposer que votre application aura accès à contrôler, du moins pas directement. Vous pourriez être en mesure de l'influencer indirectement par la mesure de l'utilisation du PROCESSEUR et de régler la longueur du travail et des cycles de sommeil pour obtenir le résultat souhaité.
Si vous n'avez pas l'esprit de blocage du thread en cours, vous pouvez utiliser un WaitHandle.
Bien sûr, quelque chose de plus complexe qui peut être construit en fonction de ce que vous essayez d'accomplir.
C'est parfait comme un VB.net le sommeil de remplacement. Maintenant ma console application n'est PAS signalé comme non réactif car je n'ai pas sommeil commandes!
Juste ajouter les Importations Système.Filetage au-dessus de votre module et la placer juste au-dessus de votre sub main
Ensuite, dans votre sous-main, l'utilisation
pour mettre en pause votre application pour les 100 millisecondes.
Avoir du plaisir
Vous devriez prendre note de si vous le faites dans l'INTERFACE utilisateur principale de Fil ou un fil de discussion ont essaimé.
Pour les Threads de la façon la plus simple est juste de Thread.Sommeil(x millisecondes)
Sur l'INTERFACE principale thread, j'ai tendance à utiliser une fonction DoEvents dans vb.net et vb6 comme ce
Sur la question de l'utilisation du PROCESSEUR je la regarde comme ça.... si vous faites juste un dur boucle comme
Je m'attends à voir très élevée de l'uc à l'utilisation de plus de 50% parce que le thread d'INTERFACE utilisateur est difficile de blocage sur ce.... dans la plupart des cas, le système de windows permettra de limiter l'utilisation du processeur d'un programme donné, de sorte que son fils ne pas bloquer l'ensemble du système.
La fonction DoEvents de s'assurer que le message de windows pompes à incendie corriger et répondre à corriger. Il s'assure également que le garbage collector feux sur l'heure.
Aussi, si vous avez d'autres threads filé hors de votre INTERFACE utilisateur.Enfilez votre INTERFACE utilisateur.Thread peut réagir à des événements déclenchés à partir de ces autres threads....
Dans de tels cas où votre appel contrôles de formulaire à partir d'autres threads et ne forme.InvokeRequired routines seront en mesure de répondre correctement.
Aussi Le seul moment où vous devriez être dur en boucle sur le MainUI thread, c'est quand il est en réponse à certaines activités de l'utilisateur et vous avez besoin de mettre les attentes de l'utilisateur de voir les progrès de quelque chose....
Si c'est une sorte de processus automatisé qui est toujours en cours d'exécution... look à la déplacer dans un autre thread.
Ou si c'est quelque chose qui s'exécute périodiquement sur une minuterie ou d'un temps qui lance un thread.
Quelqu'un s'il vous plaît dites-moi si je me trompe sur ces hypothèses....
Pas sûr au sujet de l'Utilisation de wh Comme Nouveau ManualResetEvent(Faux) wh.WaitOne(ms) que je n'ai jamais entendu parler de ça et n'ont aucune idée de ce que cela fait.