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

Lazarus Pascal Discussion :

Changement de priorité d'un thread


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 15
    Par défaut Changement de priorité d'un thread
    Bonjour,

    dans une application de gestion technique, (win32/Linux) j'ai mis en place un thread pour réaliser un traitement ponctuel.
    La contrainte est que ce traitement doit être fait rapidement.
    Pour réaliser cela, je cherche à modifier le niveau de priorité du thread.

    J'ai d'abord essayé la property Priority de l'objet TThread, mais elle n'a aucune influence.
    Ensuite, j'ai fait des tests avec FpSetPriority (PRIO_PROCESS,FpGetPid,-15); dans la partie code du Thread.
    Mais je me suis rendu compte que la fonction FpGetPid retourne toujours le PID de la tache principale.

    Pourtant, sous Linux en utilisant en mode console la commande nice pour modifier le niveau de priorité du thread, le résultat correspond à mon attente.

    Connaissez vous une méthode pour, soit modifier le niveau de priorité d'un Thread, soit connaitre le PID du Thread ?
    Cordialement

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Citation Envoyé par Tyrrell Voir le message
    Pourtant, sous Linux en utilisant en mode console la commande nice pour modifier le niveau de priorité du thread, le résultat correspond à mon attente.

    Connaissez-vous une méthode pour, soit modifier le niveau de priorité d'un Thread, soit connaitre le PID du Thread ?
    Cordialement
    Sous Linux, il est facile d'utiliser TProcess à qui on passera un exe ("nice") et des paramètres, je peux aider sur ce coup-là.
    Sous Windows, pas la moindre idée.
    J'ai ça, qui vient d'un vieux truc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    {
    IDLE_PRIORITY_CLASS          $00000040
    BELOW_NORMAL_PRIORITY_CLASS  $00004000
    NORMAL_PRIORITY_CLASS        $00000020
    ABOVE_NORMAL_PRIORITY_CLASS  $00008000
    HIGH_PRIORITY_CLASS          $00000080
    REALTIME_PRIORITY_CLASS      $00000100
    }
    begin
      oldState := EnableNTPrivilege (SE_DEBUG_NAME, SE_PRIVILEGE_ENABLED);
      SetPriorityClass(GetCurrentProcess, $00000080);
    mais je crois bien que ça n'a jamais fonctionné (ou je n'ai pas su le mettre en œuvre, ou je n'ai pas su le mesurer).
    Et c'est du D7, je ne sais pas si c'est compatible Lazarus.

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 933
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    Par défaut
    PID est l'identificateur du processus et sera toujours le même quelque soit la tâche. L'identificateur du thread s'obtient par GetCurrentThreadId.

    Il y a deux notions au niveau de priorités : la priorité du processus et celle de la tâche. Les deux forment la priorité de base qui determine le partage du temps processeur (info Windows). Il faut donc se demander dans un premier temps si la tâche secondaire est prioritaire sur les tâches du processus courant uniquement ou du système complet.

    Mais modifier ces priorités n'aura pas forcément un effet "visible" puisqu'il dépend du niveau de priorité des autres processus/tâches. S'il n'y a aucune demande de priorité supérieure, notre tâche ne sera pas interrompue et on ne constatera aucune différence sur son exécution en cours. Elle démarrera cependant plus rapidement lors de sa prochaine planification par l'OS si sa priorité a été augmentée.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 15
    Par défaut
    Bonjour et merci pour vos réponses.

    Andnotor, j'ai mis en oeuvre les fonctions GetCurrentThreadId et ThreadSetPriority, mais cela n'a rien amélioré.
    Il est possible que je ne comprenne pas à 100% le mécanisme des priorités, mais voilà m'a démarche sous Linux:
    - J'ai une tâche de fond qui gère un traitement et reçoit par moment des images. Cette image à besoin d'un traitement rapide, et c'est le rôle du Thread.
    Lorsque je mets en oeuvre le code suivant au démarrage du Thread, le traitement est d'environ 10 sec.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var
      MyThreadID:TThreadID;
      MyResult:Boolean;
     
      MyThreadID := GetCurrentThreadId;
      MyResult := ThreadSetPriority(MyThreadID,-10);
    En mode console de Linux, voici le résultat des priorités avec la commande suivante: ps -To pid,nice,comm
    - PID de la tache de fond 399
    - PID du thread qui nous concerne 442
    Nom : Thread1.JPG
Affichages : 314
Taille : 18,4 Ko
    Je constate que le niveau de priorité des process 399 et 442 est identique et égal à 0. La fonction ThreadSetPriority n'a pas eu d'effet à ce niveau.

    Lorsque je modifie manuellement le niveau de priorité par la console avec la commande renice -10 -p442 le traitement est d'environ 6 sec.
    En mode console de Linux, voici le résultat des priorités avec la commande suivante: ps -To pid,nice,comm
    Nom : Thread2.JPG
Affichages : 321
Taille : 18,0 Ko
    Le process 442 correspondant à mon thread voit son niveau de priorité passé réellement à -10, d'où le gain de temps.

    Comment réaliser la même chose dans le code ?
    Merci de votre aide
    Cordialement

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 933
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    Par défaut
    Je ne connais pas suffisamment Linux pour te donner beaucoup d'indications.

    Ce que je constate est que c'est au niveau du processus que tu agis manuellement, ce serait donc bien FpSetPriority. Mais as-tu contrôlé le résultat de la fonction ?

    Lorsque je lis ceci :
    Errors
    sys_eacces: A non-superuser tried to a priority increase.
    je me dis que tu es en root lors de l'action manuelle mais que ton app ne dispose pas de suffisamment de droits.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 15
    Par défaut
    Cela aurait pu être un problème de droit d'accès, mais hélas non.
    Mon application a bien le niveau root lors de son fonctionnement. Je le vois dans la colonne USER, avec la commande TOP.

    Mais j'ai trouvé une solution, qui fonctionne mais est-elle "élégante" ?
    Je pars de l'axiome qui dit que lors de sa création, le thread prend le niveau de priorité de son parent.
    En donnant momentanément le niveau de priorité voulu à la tâche créant le thread, j'obtiens bien un thread avec ce niveau de priorité.
    Seule contrainte, il n'est pas possible de modifier ce niveau de priorité durant la vie du thread.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    constructor TThreadAbs.Create;
    var
      MyPriority:LongInt;
     
    begin
      MyPriority := 20 - FpGetPriority(PRIO_PROCESS,FpGetPid);        // Lecture du niveau de priorité de la tache de fond, fourni entre 0 et 40
      FpSetPriority(PRIO_PROCESS,FpGetPid,-10);                       // Force le niveau de priorité voulu pour le Thread
      inherited Create(True);                                         // Création du Thread
      FpSetPriority(PRIO_PROCESS,FpGetPid,MyPriority);                // Remet le niveau de priorité de la tache de fond, devant être entre -20 et 19
    ...
    Qu'en pensez vous ?

Discussions similaires

  1. Pb Changement de vue avec Animation + thread
    Par Hyst_76 dans le forum Android
    Réponses: 4
    Dernier message: 21/02/2014, 10h51
  2. priorité sur des threads
    Par kiby56 dans le forum Général Python
    Réponses: 1
    Dernier message: 24/02/2013, 16h37
  3. changement de priorité d'un thread
    Par d'Oursse dans le forum Windows
    Réponses: 4
    Dernier message: 31/05/2011, 13h39
  4. Priorité dans les threads
    Par ToTo13 dans le forum Android
    Réponses: 1
    Dernier message: 20/05/2011, 15h29
  5. Réponses: 2
    Dernier message: 11/07/2006, 10h34

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