IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

[Process] Changer la priorité d'un processus


Sujet :

VB 6 et antérieur

  1. #1
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Points : 156
    Points
    156
    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.

  2. #2
    Membre éclairé
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Points : 777
    Points
    777
    Par défaut
    avec ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Declare Function SetPriorityClass Lib "kernel32" Alias "SetPriorityClass" (ByVal hProcess As Long, ByVal dwPriorityClass As Long) As Long
    · 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.

  3. #3
    mat.M
    Invité(e)
    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

  4. #4
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Points : 156
    Points
    156
    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....

  5. #5
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Points : 156
    Points
    156
    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.

  6. #6
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Points : 156
    Points
    156
    Par défaut
    Les déclarations
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Changer la priorité des processus d'arrière plan Oracle
    Par dcollart dans le forum Administration
    Réponses: 1
    Dernier message: 16/07/2010, 16h22
  2. Réponses: 0
    Dernier message: 03/10/2007, 17h31
  3. Réponses: 5
    Dernier message: 08/08/2007, 00h27
  4. Réponses: 3
    Dernier message: 17/02/2005, 01h39
  5. [VB6] Forçage de la priorité d'un processus Windows
    Par okyle dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 01/06/2004, 12h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo