Sleep sans avoir 99% de CPU de pris ? [C++] - C++ - Programmation
Marsh Posté le 29-10-2003 à 22:25:00
quel OS/architecture/niveau de précision ?
Marsh Posté le 29-10-2003 à 22:26:18
sleep() ne prends rien en CPU, t'as bus toi..
Marsh Posté le 29-10-2003 à 22:27:17
*Syl* a écrit : sleep() ne prends rien en CPU, t'as bus toi.. |
va apprendre à lire mon jeune
Marsh Posté le 29-10-2003 à 22:29:00
SchnapsMann a écrit : |
Arf..et le salaud m'a quoté, faudrais que je vienne plus sur le forum le soir parce qu'hier j'ai également fait une bourde parce que j'avais mal lu
Marsh Posté le 29-10-2003 à 22:29:58
kadreg a écrit : quel OS/architecture/niveau de précision ? |
Niveau de précision : le même que le sleep de windows
OS : winwin
architecture : x86 et supérieurs
Marsh Posté le 29-10-2003 à 22:35:28
Je crois que j'ai compris ce qu'il veut.
Je pense qu'il veut avoir la main pendant un Sleep.
Donc pour cela n'utilise pas Sleep mais la fonction GetTickCount.
The GetTickCount function retrieves the number of milliseconds that have elapsed since the system was started. It is limited to the resolution of the system timer. If you need a higher resolution timer, use amultimedia timer or a high-resolution timer.
DWORD GetTickCount(VOID)
Parameters
This function has no parameters.
Return Values
The return value is the number of milliseconds that have elapsed since the system was started.
Remarks
The following table describes the resolution of the system timer.
System Resolution
Windows NT 3.5 and later The system timer runs at approximately 10ms.
Windows NT 3.1 The system timer runs at approximately 16ms.
Windows 95 and later The system timer runs at approximately 55ms.
The elapsed time is stored as a DWORD value. Therefore, the time will wrap around to zero if the system is run continuously for 49.7 days.
Windows NT: To obtain the time elapsed since the computer was started, look up the System Up Time counter in the performance data in the registry key HKEY_PERFORMANCE_DATA. The value returned is an 8-byte value.
QuickInfo
Windows NT: Requires version 3.1 or later.
Windows: Requires Windows 95 or later.
Windows CE: Requires version 1.0 or later.
Header: Declared in winbase.h.
Import Library: Use kernel32.lib.
Marsh Posté le 29-10-2003 à 22:41:34
Nan, pas GetTickCount() puisque c'est juste pour récupérer un nombre, et s'il fait un while() pour faire son sleep() bah ça bouffera tout le CPU
Marsh Posté le 29-10-2003 à 22:49:23
*Syl* a écrit : Nan, pas GetTickCount() puisque c'est juste pour récupérer un nombre, et s'il fait un while() pour faire son sleep() bah ça bouffera tout le CPU |
Bingo *syl*
Marsh Posté le 29-10-2003 à 22:49:59
Mon sleep ressemble a ca pour le moment :
Code :
|
Marsh Posté le 29-10-2003 à 23:02:06
*Syl* a écrit : mais pkoi tu veux pas utiliser sleep() ???? |
Parce que :
-Ca prends 100% du CPU
-Sur certains processeurs à économie d'énergie, le Sleep déclenche le changement de fréquence ( Speedstep et co).
Marsh Posté le 29-10-2003 à 23:06:41
sur mon w2k, un sleep ne prend pas de temps processeur.
sinon tu peux essayer de faire un WaitForSingleObject ( http://msdn.microsoft.com/library/ [...] object.asp ) sur un objet que tu ne signales pas.
(en admettant que tu codes sous VC++)
Marsh Posté le 29-10-2003 à 23:07:07
Citation : Ca prends 100% du CPU |
NOOOOOOOOOOOONNNNNN, je l'ai dis plus haut, y'avais 2 manière de comprendre ton post initial donc SchnapsMann je veux des excuses, sisi
Citation : Sur certains processeurs à économie d'énergie, le Sleep déclenche le changement de fréquence ( Speedstep et co). |
Bah euhh..
Marsh Posté le 29-10-2003 à 23:08:48
SquiZz a écrit : sinon tu peux essayer de faire un WaitForSingleObject ( http://msdn.microsoft.com/library/ [...] object.asp ) sur un objet que tu ne signales pas. |
Wé mais il le signale qd ? Après un sleep() ?
SquiZz a écrit : (en admettant que tu codes sous VC++) |
euh..remarque inutile, tu codes en win32 t'as axx à ça..
Marsh Posté le 29-10-2003 à 23:12:30
*Syl* a écrit : Wé mais il le signale qd ? Après un sleep() ? |
justement tu le signales pas et t'attends le timeout de ton WaitForSingleObject
*Syl* a écrit : |
bon désolé mais j'avais pas fait attention que c'était du win32, comme je code que des trucs avec les MFC je fais plus attention.
Marsh Posté le 29-10-2003 à 23:12:55
*Syl* a écrit :
NOOOOOOOOOOOONNNNNN, je l'ai dis plus haut, y'avais 2 manière de comprendre ton post initial donc SchnapsMann je veux des excuses, sisi
Bah euhh.. |
Ben désolé, mais ca se comprends comment ?
Vi, c'est chiant, quand tu veux mesurer la fréquence de la faire descendre pendant le test
Marsh Posté le 29-10-2003 à 23:13:38
SquiZz a écrit : |
C'est pas bête, je code sous VC++ .NET, mais tu peux détailler ?
Un objet que je ne signale pas
Marsh Posté le 29-10-2003 à 23:17:01
tetedeiench a écrit : |
Si Sleep prenait 100% du cpu, cette fonction n'aurait aucun intéret; on utiliserait des boucles vides...
Je pense que pour ton probleme tu devrais essayer de diminuer la priorité de ton application avec SetThreadPriority (si ma mémoire est bonne) avec une boucle qui mouline un GetTickCount
Marsh Posté le 29-10-2003 à 23:20:19
tetedeiench a écrit : |
un truc genre
Code :
|
Marsh Posté le 29-10-2003 à 23:25:17
A tester mais j'pense que ça reviendra au même que Sleep().. J'viens de mâter vite fait les appels que font WaitForSingleObject() et Sleep() et les 2 font appels aux même primitives, GetTickCount() en autres..
Marsh Posté le 29-10-2003 à 23:25:22
en plus propre tu peux aller voir ça :
http://msdn.microsoft.com/library/ [...] bjects.asp
Marsh Posté le 29-10-2003 à 23:26:35
*Syl* a écrit : A tester mais j'pense que ça reviendra au même que Sleep().. J'viens de mâter vite fait les appels que font WaitForSingleObject() et Sleep() et les 2 font appels aux même primitives, GetTickCount() en autres.. |
tiré du premier lien que j'ai donné :
Remarks |
Marsh Posté le 29-10-2003 à 23:27:28
SquiZz a écrit :
|
et ?
j'ai pas dis que ça bouffait du CPU hein..
Marsh Posté le 29-10-2003 à 23:32:53
*Syl* a écrit : et ? |
désolé, j'ai lu/interprété un peu rapidement ton message
Marsh Posté le 29-10-2003 à 23:33:41
SquiZz a écrit : |
y'a pas d'mal, j'arrête pas de mal interpréter les messages le soir moi aussi
Marsh Posté le 30-10-2003 à 01:46:03
ché pas tu peux mettre un timer:
pour un process, quand y'a rien dans le queue de messages, le process est mis en attente.
quand tu reçois le message du timer, tu fais un "resume" de ton thread timé...
comme ça si tu reçois des autres messages (redraw, alt-f4), ton process réagira.
ça dépends de la précision que tu veux
Marsh Posté le 30-10-2003 à 02:29:45
On peut savoir savoir ce que c'est ce processus qui te prends 100% du CPU ? Si ca ce trouve c'est un proc kernel dans le genre du « wait » d'AIX.
Marsh Posté le 30-10-2003 à 07:09:49
Me suis mal expliqué :
-Je peux pas utiliserle Sleep car cela décenche l'écnomie d'énergie sur les portable
-Ma fonction de sleep prends 100% CPU
Marsh Posté le 30-10-2003 à 07:20:45
si un programme fait appel a la fonction sleep, le mode d'economie d'energie est declenchee ????
c'est quand meme bizarre nan ? genre tu fais tourner milles trucs, un de tes programmes fait appel a Sleep, et hop tout bascule ?
ca me parait douteux ca...et puis au pire, ca peut se desactiver je pense...en commencant par brancher le portable sur le secteur
Marsh Posté le 30-10-2003 à 09:15:45
Il me semble avoir eu des soucis également avec sleep() y a qqs années, mais je ne me rappele plus trop dans quel cas, mais j'avais des fonctionnements différents au niveau charge cpu suivant que j'utilisais Sleep(0) ou _sleep(0).
Marsh Posté le 30-10-2003 à 09:23:57
Pour endormir ton processus de maniere portable tu peux faire ca:
struct timeval tv;
tv.tv_sec=15; // Attends 15 secs
tv.tv_usec=0;
select(0, NULL, NULL, NULL, &tv);
par contre a cause d'un bug dans le select de winsock ca ne marchera pas sous windows, et dans ce cas remplace ca par un
HANDLE he=CreateEvent(NULL, TRUE, FALSE, NULL);
WaitForSingleObject (he, 15000);
CloseHandle (he);
Marsh Posté le 30-10-2003 à 09:58:27
Si j'ai bien compris, tu veux faire une pause dans l'execution de ton programme, pause qui n'utilise pas de CPU mais qui ne déclenche pas la fonction d'économie d'énergie des portables. Fonction qui est déclenchée quand le CPU ne travaille pas a fond. Je me trompe ? C'est pas gagné dans ce cas
Marsh Posté le 30-10-2003 à 12:36:07
Il y a peut-être la solution de changer la priorité de ton processus au niveau "Idle" pendant la durée d'attente. Ainsi ton processus pourra se permettre de prendre 100% du CPU, mais si une autre application demande du CPU, alors le CPU lui sera affecté plutôt qu'à ton application. Et si cette application demande 100% du CPU alors ton application en consommera zéro.
Bref, ton application, avec une priorité "Idle" , prendra toujours tout le CPU que les autres applications n'ont pas demandé, et seulement celui-là.
Marsh Posté le 30-10-2003 à 12:42:15
BifaceMcLeOD a écrit : Il y a peut-être la solution de changer la priorité de ton processus au niveau "Idle" pendant la durée d'attente. Ainsi ton processus pourra se permettre de prendre 100% du CPU, mais si une autre application demande du CPU, alors le CPU lui sera affecté plutôt qu'à ton application. Et si cette application demande 100% du CPU alors ton application en consommera zéro. |
La fréquence risque d'être modifiée dans ce cas là, à tester..
Marsh Posté le 30-10-2003 à 12:54:03
souk a écrit : si un programme fait appel a la fonction sleep, le mode d'economie d'energie est declenchee ???? |
Cai pas moi qui l'a dit, c'est un ami de CPU-Z
Citation : Le Sleep déclenche le mode basse conso (pas sur tous, ça le fait sur PIII-M mais pas sur P4-M). |
Pour le waitforsingleobject, merci, je tente le coo
Marsh Posté le 30-10-2003 à 14:38:36
c'est pas le sleep qui le déclenche le mode basse conso, c'est le kernel, donc c'est applicable à toutes les formes de non-utilisation cpu d'un point de vue os
et c'est quoi le problème à avoir le cpu en mode économie d'énergie ?
Marsh Posté le 30-10-2003 à 14:43:34
BJOne a écrit : c'est pas le sleep qui le déclenche le mode basse conso, c'est le kernel, donc c'est applicable à toutes les formes de non-utilisation cpu d'un point de vue os |
Essaye de mesurer la fréquence du CPU quand celle ci baisse qu'on rigole.
Ensuite, relis bien mon message, le kernel entre en mode basse conso si appel a sleep sur P3M, Dixit monsieur CPU-Z J'ose pas trop l'contredire tu vois ^^
Marsh Posté le 30-10-2003 à 15:56:26
*Syl* a écrit : La fréquence risque d'être modifiée dans ce cas là, à tester.. |
Je ne pense pas car le CPU reste utilisé à 100% dans tous les cas.
Marsh Posté le 29-10-2003 à 22:22:05
Je recherche une alternative a la fonction sleep qui prenne pas 100% du CPU
Ca existe ? ( ca doit aussi etre relativement précis )
Merci