[.Net] Consommation CPU (While + Thread) [Résolu]

Signaler
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
-
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
-
Bonsoir,
Voici mon code ci-dessous c'est un exemple
Il surveille la fermeture d'un process

Mais je me suis rendu compte que dans le gestionnaire de taches il occupait entre 80% et 100% tout le temps de la boucle while.
Quelqu'un a t-il une idée pour faire baisser la charge cpu? Dois-je utiliser autre chose qu'un While ??? Ma fonction de test IsProcessRunning est-elle trop lourde avec elle aussi une boucle for ???

Merci d'avance

------------------------------------------------------------------
Imports System.Diagnostics
Imports System.Threading

Delegate Sub SyncDelegate()


Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

For Each pProcess As Process In Process.GetProcesses
ListBox1.Items.Add(pProcess.ProcessName)
Next

ListBox1.Sorted = True

End Sub

Public Sub WaitingMessage()

While (IsProcessRunning("winamp"))
Application.DoEvents()
Label1.Text = "Winamp est ouvert"
End While

Label1.Text = "Winamp est fermer"

End Sub

Public Sub Synchro()

Dim Del As New SyncDelegate(AddressOf WaitingMessage)

Label1.Invoke(Del)

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim tThread As New Thread(AddressOf Synchro)
tThread.Start()

End Sub

Private Function IsProcessRunning(ByVal ProcessName As String) As Boolean

Dim pProcess As Process

For Each pProcess In Process.GetProcesses
If pProcess.ProcessName = ProcessName Then
Return True : Exit Function
End If
Next

Return False

End Function

End Class

8 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Par API, 0 boucle et donc quasi 0% occupation cpu.


FindWindow(...)
GetWindowThreadProcessId() pour avoir processId.
hprcss = OpenProcess(SYNCHRONIZE, 0, prcsid);


Ensuite envoyer le hprcss dans un thread qui contiendra seulement cela:
WaitForSingleObject(hprcss, INFINITE);
CloseHandle(hprcss);

ciao...
BruNews, MVP VC++
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
C'est vrai qu'en .net ont oublit vite les api...
Mais je rencontre un petit soucis je n'arrive pas à récupérer le handle de n'importe quel fenetre !

En fait pour etre clair à un moment donné j'execute une ligne de commande "Rundll32.exe advapi32.dll,ProcessIdleTasks" (réinit. le prefetcher).
Je dois afficher dans un label un message tant que le process "rundll32.exe" existe
Donc je ne sais pas si le FindWindow peut marcher avec puisqu'il n'y a pas de fenetre !
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
BruNews,
J'ai laissé tomber les api j'ai trouvé ce qu'il me fallait dans le framework
Mon code ci-dessous marche c'est à dire que je lance un process et dès que celui se termine j'ai un message qui s'affiche dans un label.
Mais le problème c'est que mon appli reste bloqué tant que le process lancé n'est pas terminé !
Je ne comprend pas trop !!
Si tu avais une petite idée... Merci

Voici le code (sans boucle cette fois...lol)

Imports System.Diagnostics
Imports System.Threading

Delegate Sub SyncDelegate(ByVal Message As String)

Public Class Form1

Dim pProcess As New Process
Dim pID As Integer

Public Sub WaitingMessage(ByVal Message As String)

pProcess.WaitForExit()

Label1.Text = Message

End Sub

Public Sub Synchro()

Dim Del As New SyncDelegate(AddressOf WaitingMessage)

Label1.BeginInvoke(Del, New Object() {"Le processus est terminé"})

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

'pProcess.StartInfo.FileName = "rundll32.exe"
'pProcess.StartInfo.Arguments = "advapi32.dll,ProcessIdleTasks"

pProcess.StartInfo.FileName = "C:\Program Files\Winamp\winamp.exe"
pProcess.Start()

Pid = pProcess.Id

Dim tThread As New Thread(AddressOf Synchro)
tThread.Start()

End Sub

End Class
Messages postés
14770
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
27 février 2021
151
Sinon, pour les boucles en .NET, System.threading.Thread.Sleep(TmpInMilliSeconds)



Il est plus facile de batiser kk1 que de la convertir. (surtout en programmation)

Une question se pose sur le forum, pas en privé


NH
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
L'attente de fin du processus doit se trouver en thread séparé sinon tu bloques le prog.
Lance le processus par ShellExecuteEx (ou truc du framework si existe) pour avoir un handle de processus et suis le principe que je t'ai mis plus haut.

ciao...
BruNews, MVP VC++
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
OK merci BruNews cela marche maintenant mon appli ne se bloque plus mais de ce fait cela me pose un problème.
Dans le thread créer ou je lance le process et que j'attend sa fermeture et bien je dois modifier un objet label qui ne se trouve pas dans le meme thread que ce thread du process. Alors je doit faire un deleguate pour resynchroniser mon objet mais cela ne marche pas car mon sub de deleguation se trouve dans le thread principal alors mon prog se bloque comme tu avais dis auparavant !
Je ne sais pas trop quoi faire
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Alors la c'est trop frameworkien pour moi, tout ceci est si simple en C...
Un "label qui se trouve dans un thread", voila bien un truc qui n'a pas de sens Windowsement parlant, son handle est connu et unique pour tout le système.
Ne te semblent pas délirantes et insupportables toutes ces con****ies de langage interprété ?

ciao...
BruNews, MVP VC++
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
Oui je suis assez d'accord avec toi !
Mais j'utilise le framework 2 et ses une nouveauté (sécurité) le fait qu'un thread ne puisse pas modifier un objet d'un autre thread.
Mais bon c'est un débat sans fin le framework, il y a les puristes qui préférent le c ou c++ et ceux qui préférent la simplicité et la soupleese comme ce qu'offre le framework
Sinon te casses plus la tête j'ai trouvé une autre méthode c'est pas grave je me suis débrouillé.
Je vais valider ta première réponse c'est celle la qui ma mis sur la voie :)
Merci