Précédent   Forum des professionnels en informatique > Autres langages > Général Visual Basic 6 et VBScript > VB 6 et antérieur

VB 6 et antérieur Visual basic 6 et versions antérieures. Avant de poster -> La FAQ VB6, Les tutoriels VB

Réponse
 
Outils de la discussion
Vieux 16/02/2005, 17h31   #1 (permalink)
Membre Confirmé
 
Date d'inscription: avril 2003
Messages: 299
Envoyer un message via MSN à WriteLN
Par défaut [Process] Changer la priorité d'un processus

Salut à tous,

Est-ce qu'il est possible en VB de réduire la priorité d'un processus si je connait son nom?
En fait mon but serait de détecter si un ou plusieurs processus nommés ntvdm.exe tournent sur Windows.
Si c'est le cas, je voudrais réussir à changer leur priorité en LOW.

C'est très important pour moi de trouver un moyen de bloquer un peu ce processus qui me bouffe 99% du CPU dés que j'ai un programme DOS 16 bit qui tourne sous win2k ou XP (NT koi).

Si quelqu'un à un exemple, de la doc ou un API pour moi je suis preneur.

Merci d'avance pour toute info.
__________________
WebAgency www.cpstyle.net
BncAgency www.bncmasters.net
WriteLN est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/02/2005, 18h20   #2 (permalink)
Modérateur
 
Avatar de shwin
 
Date d'inscription: novembre 2003
Messages: 576
Par défaut

avec ceci
Code :
 
Declare Function SetPriorityClass Lib "kernel32" Alias "SetPriorityClass" (ByVal hProcess As Long, ByVal dwPriorityClass As Long) As Long
 
Citation:
· hProcess
Identifies the process.
Windows NT: The handle must have the PROCESS_SET_INFORMATION access right. For more information, see Process Objects.

· dwPriorityClass
Specifies the priority class for the process. Specify one of the following values:
HIGH_PRIORITY_CLASS
Specify this class for a process that performs time-critical tasks that must be executed immediately. The threads of the process preempt the threads of normal or idle priority class processes. An example is Windows Task List, which must respond quickly when called by the user, regardless of the load on the operating system. Use extreme care when using the high-priority class, because a high-priority class application can use nearly all available CPU time.
IDLE_PRIORITY_CLASS
Specify this class for a process whose threads run only when the system is idle. The threads of the process are preempted by the threads of any process running in a higher priority class. An example is a screen saver. The idle-priority class is inherited by child processes.
NORMAL_PRIORITY_CLASS
Specify this class for a process with no special scheduling needs.
REALTIME_PRIORITY_CLASS
Specify this class for a process that has the highest possible priority. The threads of the process preempt the threads of all other processes, including operating system processes performing important tasks. For example, a real-time process that executes for more than a very brief interval can cause disk caches not to flush or cause the mouse to be unresponsive.

Ca va te prendre le handle du process et non pas le nom du process.
__________________
Remoting Context Matters
Citation:
Everything in this chapter is 100 percent undocumented. Reliance on these techniques is not supported by either Microsoft, the publisher, or the author of this book. Use at you own risk! If your computer won't work afterwards, your toaster blows up or your car doesn't start, I assume no liability whatsoever: You're now about to enter the uncharted territories of .NET and you do so on your own risk. I can only provide some guidance
shwin est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/02/2005, 18h39   #3 (permalink)
mat.M
Guest
 
Messages: n/a
Par défaut

L'API de Shwin donnera sans doute satisfaction mais ce que tu demandes c'est plus de la maintenance systeme que du développement.
Une appli qui prend 99% des ressource c'est qu'il ya un pb
Soit réinstaller l'appli soit le système.
Si c'est une appli "maison" c'est qu'elle est mal programmée c.a.d. qu'elle contient un processus qui demande trop de ressources
  Envoyer un message privé Réponse avec citation
Vieux 16/02/2005, 22h45   #4 (permalink)
Membre Confirmé
 
Date d'inscription: avril 2003
Messages: 299
Envoyer un message via MSN à WriteLN
Par défaut

Merci pour l'info shwin, je vais tester ca cette semaine et voir si je peux retrouver le process nommé ntvdm pour en changer la priorité...

mat.M, le probème ne vient malheureusement pas de mon appli mais du fait que c'est tout simplement une application dos 16bit développé récemment par moi-même.
Ce n'est pas mon programme qui demande 99% des ressources mais bien le processus Krosoft NTVDM (NT virtual dos machine) qui fait la gestion du cmd.exe pour l'exécution d'un programme 16bit.
D'apres les articles que j'ai pu lire, ce processus se croit seul et prend toutes les ressources dispos (notamment pour lem ouse polling, keyboard polling)
Aucune solution n'existe pour palier ce problème sauf un soft appelé Tame4.5 qui fait une gestion parfaite de ce problème et réduit l'utilsiation CPU au strict mnimum mais dans mon cas ca pose un prob de compatibilité avec telnet server que j'utilise...

Je sais que tout ca semble compliqué mais je travaille sur des appareils de production industriel dos et je dois accèder des base access ... d'ou cette solution...

Pour en revenir au bug de windows, cette solution, avec un timer, me permettrait de manuellement réduire la priorité des proces ntvdm dés leur mise en route.
Si vous aviez un exemple pour moi ca m'aiderait car je suis pas très fort en ce qui concerne l'utilsiation des API.
Il va aussi falloir que je trouve un moyen de retrouver mes process par leur nom

encore merci pour les infos en tout cas....
__________________
WebAgency www.cpstyle.net
BncAgency www.bncmasters.net
WriteLN est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 17/02/2005, 09h48   #5 (permalink)
Membre Confirmé
 
Date d'inscription: avril 2003
Messages: 299
Envoyer un message via MSN à WriteLN
Par défaut

Je viens de trouver un article avec du code VB qui pourrait m'aider à déterminer le processus et en complément avec la solution de shwin il serait possible de réduire sa priorité.

http://www.vbaccelerator.com/home/VB/Tips/Getting_Process_Information_Using_PSAPI/article.asp

N'étant pas expert en API j'ai un peu de mal à comprendre comment faire mais apparement il récupère d'abord le nombre d eprocess (ca marche aussi pour moi).
Ensuite il crée le handle en se basant sur l'ID du process et enfin il récupère le nom de ce fameux process.
Malheureusement je bloque... Je n'arrive pas à récupèrer le nom du processus...

En fait je suis bloqué dans l'étape juste avant.

Si quelqu'un pouvait m'aider à finir ce code pour pourvoir énumèrer les process un par un avec leur nom comme ca je pourrais utiliser le handle pour réduire la priorité...

Merci d'avance pour votre aide.
__________________
WebAgency www.cpstyle.net
BncAgency www.bncmasters.net
WriteLN est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 17/02/2005, 12h12   #6 (permalink)
Membre Confirmé
 
Date d'inscription: avril 2003
Messages: 299
Envoyer un message via MSN à WriteLN
Par défaut

Les déclarations
Code :
Private Const MAX_PATH = 260
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function SetPriorityClass Lib "kernel32" (ByVal hProcess As Long, ByVal dwPriorityClass As Long) As Long
Private Declare Function GetPriorityClass Lib "kernel32" (ByVal hProcess As Long) As Long
 
Private Const PROCESS_VM_READ = &H10
Private Const PROCESS_SET_INFORMATION = &H200
Private Const PROCESS_QUERY_INFORMATION = &H400
Toutes les 5 secondes je récupère la liste des processus
Code :
Private Sub Timer_process_Timer()
Dim aProcesses() As Long
Dim cbNeeded As Long
Dim cProcesses As Long
Dim i As Long
 
   ' // Get the list of process identifiers.
   ReDim aProcesses(0 To 1023) As Long
   If (EnumProcesses(aProcesses(0), 1024 * 4, cbNeeded) <> 0) Then
      '// Calculate how many process identifiers were returned.
      cProcesses = cbNeeded / 4
      '// Print the name and process identifier for each process.
      For i = 0 To cProcesses - 1
        PrintProcessNameAndID (aProcesses(i))
      Next i
   Else
      MsgBox "Failed to get process list.", vbCritical
   End If
 
End Sub
La procédure pour changer la priorité du process ntvdm.exe
Code :
Public Sub PrintProcessNameAndID(ByVal lProcessID As Long)
Dim szProcessName As String
Dim lLen As Long
Dim hProcess As Long
Dim hMod(0 To 1023) As Long
Dim cbNeeded As Long
Dim i As Long
Dim iMax As Long
Dim lR As Long
Dim tPMC As PROCESS_MEMORY_COUNTERS
 
   lLen = MAX_PATH
   
   hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ Or PROCESS_SET_INFORMATION, 0, lProcessID)
      '// get the process name
      If (hProcess <> 0) Then
               szProcessName = String$(lLen, 0)
               LSet szProcessName = "unknown"
               lR = GetModuleBaseName(hProcess, hMod(i), szProcessName, lLen)
               If InStr(1, szProcessName, "ntvdm.exe", 1) <> 0 Then
                  If GetPriorityClass(hProcess) = 32 Then
                     hProcess = SetPriorityClass(hProcess, 64)
                  End If
               End If
      End If
   CloseHandle hProcess
End Sub
Et enfin, il vous faudra un module .bas disponible sur le site
http://www.vbaccelerator.com/home/VB/Tips/Getting_Process_Information_Using_PSAPI/article.asp

Voila, j'espère que ca pourra aider d'autre personnes après moi. En tout cas ca me permettra de dormir plus tranquilement et de ne plus avoir d'appel de mon client

Bonne journée à tous et un immense merci à shwin pour son aide.
__________________
WebAgency www.cpstyle.net
BncAgency www.bncmasters.net
WriteLN est déconnecté   Envoyer un message privé Réponse avec citation
NEWS VISUAL BASIC 6FAQs VBTUTORIELS VBOUTILS VBSOURCES VBLIVRES VBWIKI

Réponse

Précédent   Forum des professionnels en informatique > Autres langages > Général Visual Basic 6 et VBScript > VB 6 et antérieur



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h10.


Vos questions techniques : forum d'entraide Visual Basic 6 - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2009 www.developpez.com - Legal informations.