Oui c'est ce que j'aimerais faire mais je ne veux pas que ça empêche le programme de continuer
Oui c'est ce que j'aimerais faire mais je ne veux pas que ça empêche le programme de continuer
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
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.
1/ La portabilité est-elle une contrainte ?
2/ Ton application a-t-elle une pompe à message (des fenêtres) ?
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
+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 > *
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
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 :
Comme tu vois, pas de Sleep, pas de threads, et ça devrait marcher sans aucune anicroche.
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
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
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 :
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 while(1) { LireEntree(); CalculerEtat(); EcrireSortie(); }
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
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
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager