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

Threads & Processus C++ Discussion :

Executer deux fonctions en même temps


Sujet :

Threads & Processus C++

  1. #21
    Invité
    Invité(e)
    Par défaut
    Oui c'est ce que j'aimerais faire mais je ne veux pas que ça empêche le programme de continuer

  2. #22
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par pitt77 Voir le message
    Oui j'exécute la fonction de l'API ça il n'y a pas de problèmes c'est juste que je ne sais pas comment l'exécuter sans pour autant bloquer le programme dans la boucle d'appel de cette fonction. Je sais que les lecteurs vidéos ou certains logiciels propose des options pour empêcher la mise en veille (pas le screen saver) sans utiliser les threads mais ça je ne sais pas comment ils font
    Non, tu ne le fais pas... Je t'ai mis un lien dans le message #11 de ce sujet, qui t'explique comment désactiver l'économiseur d'écran. Sans thread.

    Ensuite, il ne tient qu'à toi de le faire proprement, c'est à dire de t'assurer que tu restaures bien l'état d'activation de l'utilisateur à la sortie de ton programme... Pour ma part, je sais qu'un soft qui me flinguerait sans arrêt mes réglages partirait à la poubelle très vite.

    Quant à la veille des disques durs, c'est encore autre chose, mais ils sont rarement mis en veille s'ils sont utilisés, et c'est le cas si t'es en cours de lecture d'un fichier vidéo.

    Tu peux également aller voir du côté des fonctions CallNtPowerInformation pour désactiver l'économie d'énergie de façon générale, ou tout simplement appeler SetThreadExecutionState dans ta boucle d'exécution (i.e. après chaque décodage de trame ou de trame de référence). De façon générale, il n'est pas conseillé de laisser un thread appeler tout seul cette fonction et ne faire "que ça".
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #23
    Invité
    Invité(e)
    Par défaut
    Bon on va faire simple, avant de poster je connaissait déjà le fonction de l'API SetThreadExecutionState() puisque je l'utilisait déjà.

    Ensuite pour la SECURITE j'appelle cette fonction sans utilisé le paramètre ES_CONTINUOUS donc je dois appeler cette fonction TOUTES LES XX SECONDES justement pour éviter les problèmes. Je ne modifie en aucun cas les paramètres de la mise en veille puisque je ne fait que remettre à 0 le temps nécessaire avant la mise en veille, donc si mon programme se ferme ou autres la mise en veille se lancera sans aucun problème, il empêche donc la mise en veille "proprement".

    Enfin pour tout ce qui est arrêt des disques dur, écran, screen saver tout est déjà gérer par la fonction de l'API.

    Maintenant mon problème c'est que je dois appeler cette fonction toutes les XX secondes sans pour autant gêner la continuité du programme en lui-même. J'ai penser aux threads mais il y a surement d'autres solutions.

  4. #24
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    1/ La portabilité est-elle une contrainte ?
    2/ Ton application a-t-elle une pompe à message (des fenêtres) ?

  5. #25
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Points : 833
    Points
    833
    Par défaut
    +1 3DArchi
    Pas besoin d'un thread si ta fonction ne fait que attendre un certain laps de temps. Désactives directement la mise en veille avec les fonction systèmes (à trouver sur MSDN pour Windows et ailleurs pour Linux) ou utilises un timer
    Linux > *

  6. #26
    Invité
    Invité(e)
    Par défaut
    S'il pouvait fonctionner sous windows se serait déjà pas mal Donc dans l'immédiat non ce n'est pas un problème.
    Je pensais ajouter une interface graphique avec Qt par exemple dès que mon programme fonctionnerait avec la console.

    EDIT: J'utilise un timer qui attends 1 min puis il appelle la fonction SetThreadBidule() mais le programme en reste à cette boucle puisqu'elle est infinie

  7. #27
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    SetThreadExecutionState est très rapide à exécuter, c'est pas ça qui va plomber tes performances. Il est toutefois préférable de l'appeler soit inconditionnellement (i.e. à chaque étape unitaire de calcul, une trame vidéo par exemple), soit en fonction des paramètres de l'utilisateur (récupération des délais via l'API PMS et agir en conséquence).

    Ensuite, t'as plusieurs solutions pour l'appeler périodiquement :
    • Un thread (c'est "mal", dans le sens où ça ne surveille pas l'activité réelle de ton application).
    • Un timer Windows (attention, là, si tu bloque la pompe à messages de Windows parce que ton code ne laisse pas assez la main, tu vas avoir des soucis). C'est déjà mieux.
    • Une deadline dans ta boucle principale de traitement qui appelle SetThreadExecutionState() en fonction de son dépassement :
      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
      // Calcul du prochain tick d'appel.
      DWORD NextTick = 0 ; // Prochain tick.
      DWORD CurrentTick ;  // Tick courant.
      DWORD TickDelay = 55 * 1000 ; // Délai (en ms) entre deux refreshs.
       
      // Autres initialisations.
       
      while (....) { // Ta boucle principale d'application.
       
        // Test de deadline :
        CurrentTick = GetTickCount() ;
        if (CurrentTick>NextTick) {
          SetThreadExecutionState(....) ;
          NextTick = CurrentTick + TickDelay ; // Réarmement
        }
        // Fin de deadline
       
      // Suite de ton code
      } // Fin de boucle principale
      Comme tu vois, pas de Sleep, pas de threads, et ça devrait marcher sans aucune anicroche.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  8. #28
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    1/Le timer windows a besoin de la pompe à message il me semble. Donc tant que tu n'as pas d'IHM tu ne peux l'utiliser.
    2/ Si tu utilises Qt, alors utilises les timer Qt (ça doit bien exister).
    3/ Si ton programme ressemble à ce que montre Mac LAK :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while(1)
    {
       LireEntree();
       CalculerEtat();
       EcrireSortie();
    }
    Alors tu n'as qu'à appeler ta fonction dans EcrireSortie() systématiquement si elle ne pénalise pas tes perfs (seul un bench te le dira). N'utilises le tick delay que si tu as la certitude que ça pénalise tes perfs et que cela t'embête dans le cadre de ton projet.

  9. #29
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    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
    // Calcul du prochain tick d'appel.
    DWORD NextTick = 0 ; // Prochain tick.
    DWORD CurrentTick ;  // Tick courant.
    DWORD TickDelay = 55 * 1000 ; // Délai (en ms) entre deux refreshs.
     
    // Autres initialisations.
     
    while (....) { // Ta boucle principale d'application.
     
      // Test de deadline :
      CurrentTick = GetTickCount() ;
      if (CurrentTick>NextTick) {
        SetThreadExecutionState(....) ;
        NextTick = CurrentTick + TickDelay ; // Réarmement
      }
      // Fin de deadline
     
    // Suite de ton code
    } // Fin de boucle principale
    Ok donc avec ça on ne reste pas bloqué dans une boucle avec un sleep c'est déjà beaucoup mieux ^^ Juste une petite question la description de GetTickCount() dit que la fonction retourne le nombre de millisecondes écoulés depuis que le système a démarré, quand il parle du système il parle de l'application ou de l'OS ?

    3DArchi
    J'étudiais la solution de Qt quand je commencerai l'interface graphique mais si tout fonctionne avant ça sera bon

  10. #30
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par pitt77 Voir le message
    Juste une petite question la description de GetTickCount() dit que la fonction retourne le nombre de millisecondes écoulés depuis que le système a démarré, quand il parle du système il parle de l'application ou de l'OS ?
    Le système, c'est toujours le système d'exploitation. Ton application sera en général appelée "processus" dans la doc Microsoft.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. Réponses: 20
    Dernier message: 04/04/2014, 11h17
  2. Actualiser un TCD et executer une autre fonction en même temps
    Par lbar012001 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/02/2008, 09h08
  3. lancer deux fonctions en même temps
    Par youp_db dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/09/2006, 12h11
  4. [JFrame]pb de lancement de deux JFrame en même temps
    Par spoutyoyo dans le forum Agents de placement/Fenêtres
    Réponses: 8
    Dernier message: 24/08/2004, 15h33
  5. Lancer deux sons en même temps...
    Par Julien_riquelme dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 03/05/2003, 17h00

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