[C++] Sleep sans avoir 99% de CPU de pris ?

Sleep sans avoir 99% de CPU de pris ? [C++] - C++ - Programmation

Marsh Posté le 29-10-2003 à 22:22:05    

Je recherche une alternative a la fonction sleep qui prenne pas 100% du CPU :D
 
Ca existe ? ( ca doit aussi etre relativement précis ;) )
 
Merci :jap:

Reply

Marsh Posté le 29-10-2003 à 22:22:05   

Reply

Marsh Posté le 29-10-2003 à 22:25:00    

quel OS/architecture/niveau de précision ?


Message édité par kadreg le 29-10-2003 à 22:25:25

---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 29-10-2003 à 22:26:18    

sleep() ne prends rien en CPU, t'as bus toi..  :sarcastic:


Message édité par *syl* le 29-10-2003 à 22:26:30
Reply

Marsh Posté le 29-10-2003 à 22:27:17    

*Syl* a écrit :

sleep() ne prends rien en CPU, t'as bus toi..  :sarcastic:  


 
va apprendre à lire mon jeune  :lol:


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 29-10-2003 à 22:29:00    

SchnapsMann a écrit :


 
va apprendre à lire mon jeune  :lol:  

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 :(


Message édité par *syl* le 29-10-2003 à 22:29:27
Reply

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 :D  
 
OS : winwin
 
architecture : x86 et supérieurs
 
:)

Reply

Marsh Posté le 29-10-2003 à 22:30:09    

Et au fait tetedeiench, pkoi tu veux une alternative ?

Reply

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.

Reply

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 [:spamafote]


Message édité par *syl* le 29-10-2003 à 22:42:21
Reply

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 [:spamafote]


 
Bingo *syl* :/

Reply

Marsh Posté le 29-10-2003 à 22:49:23   

Reply

Marsh Posté le 29-10-2003 à 22:49:59    

Mon sleep ressemble a ca pour le moment :

Code :
  1. void MySleep(unsigned long ms)
  2. {
  3. DWORD time0, time;
  4. time0 = timeGetTime();
  5. do{
  6.   time = timeGetTime();
  7. }while ( (time-time0)<ms);
  8. }

Reply

Marsh Posté le 29-10-2003 à 22:51:08    

mais pkoi tu veux pas utiliser sleep() ????

Reply

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 :D
-Sur certains processeurs à économie d'énergie, le Sleep déclenche le changement de fréquence ( Speedstep et co).
 
:D

Reply

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++)

Reply

Marsh Posté le 29-10-2003 à 23:07:07    

Citation :

Ca prends 100% du CPU :D

NOOOOOOOOOOOONNNNNN, je l'ai dis plus haut, y'avais 2 manière de comprendre ton post initial donc SchnapsMann je veux des excuses, sisi :D
 

Citation :

Sur certains processeurs à économie d'énergie, le Sleep déclenche le changement de fréquence ( Speedstep et co).

Bah euhh..

Reply

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() ? :lol:  
 

SquiZz a écrit :

(en admettant que tu codes sous VC++)

euh..remarque inutile, tu codes en win32 t'as axx à ça..

Reply

Marsh Posté le 29-10-2003 à 23:12:30    

*Syl* a écrit :

Wé mais il le signale qd ? Après un sleep() ? :lol:  


justement tu le signales pas et t'attends le timeout de ton WaitForSingleObject
 

*Syl* a écrit :


euh..remarque inutile, tu codes en win32 t'as axx à ça..


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.

Reply

Marsh Posté le 29-10-2003 à 23:12:55    

*Syl* a écrit :

Citation :

Ca prends 100% du CPU :D

NOOOOOOOOOOOONNNNNN, je l'ai dis plus haut, y'avais 2 manière de comprendre ton post initial donc SchnapsMann je veux des excuses, sisi :D
 

Citation :

Sur certains processeurs à économie d'énergie, le Sleep déclenche le changement de fréquence ( Speedstep et co).

Bah euhh..


 
Ben désolé, mais ca se comprends comment ? :D
 
Vi, c'est chiant, quand tu veux mesurer la fréquence de la faire descendre pendant le test :D

Reply

Marsh Posté le 29-10-2003 à 23:13:38    

SquiZz a écrit :


justement tu le signales pas et t'attends le timeout de ton WaitForSingleObject
 
 
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.
 


C'est pas bête, je code sous VC++ .NET, mais tu peux détailler ?
 
Un objet que je ne signale pas :??:

Reply

Marsh Posté le 29-10-2003 à 23:17:01    

tetedeiench a écrit :


Ca prends 100% du CPU :D


 
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

Reply

Marsh Posté le 29-10-2003 à 23:20:19    

tetedeiench a écrit :


C'est pas bête, je code sous VC++ .NET, mais tu peux détailler ?
 
Un objet que je ne signale pas :??:


 
un truc genre

Code :
  1. void MonSlipToutSale(int timeout)
  2. {
  3.   HANDLE handleQuiSertARien = CreateEvent(NULL, FALSE, FALSE, NULL);
  4.   WaitForSingleObject(handleQuiSertARien, timeout);
  5. }


 

Reply

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..

Reply

Marsh Posté le 29-10-2003 à 23:25:22    

en plus propre tu peux aller voir ça :
http://msdn.microsoft.com/library/ [...] bjects.asp

Reply

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
 
The WaitForSingleObject function checks the current state of the specified object. If the object's state is nonsignaled, the calling thread enters the wait state. It uses no processor time while waiting for the object state to become signaled or the time-out interval to elapse.

Reply

Marsh Posté le 29-10-2003 à 23:27:28    

SquiZz a écrit :


 
tiré du premier lien que j'ai donné :

Remarks
 
The WaitForSingleObject function checks the current state of the specified object. If the object's state is nonsignaled, the calling thread enters the wait state. It uses no processor time while waiting for the object state to become signaled or the time-out interval to elapse.



et ?
j'ai pas dis que ça bouffait du CPU hein..

Reply

Marsh Posté le 29-10-2003 à 23:32:53    

*Syl* a écrit :

et ?
j'ai pas dis que ça bouffait du CPU hein..


 
désolé, j'ai lu/interprété un peu rapidement ton message :jap:  
 

Reply

Marsh Posté le 29-10-2003 à 23:33:41    

SquiZz a écrit :


 
désolé, j'ai lu/interprété un peu rapidement ton message :jap:  
 
 

y'a pas d'mal, j'arrête pas de mal interpréter les messages le soir moi aussi [:ddr555]

Reply

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 :/

Reply

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.

Reply

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
 
:(

Reply

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 :D


---------------
L'inventeur de la cédille est un certain monsieur Groçon .
Reply

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).

Reply

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);
 

Reply

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 :)


Message édité par Kristoph le 30-10-2003 à 09:58:36
Reply

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à.


Message édité par BifaceMcLeOD le 30-10-2003 à 12:36:40
Reply

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.
Bref, ton application, avec une priorité "Idle" , prendra toujours tout le CPU que les autres applications n'ont pas demandé, et seulement celui-là.

La fréquence risque d'être modifiée dans ce cas là, à tester..

Reply

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 ????
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 :D


 
Cai pas moi qui l'a dit, c'est un ami de CPU-Z :D
 

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 :)


Message édité par Tetedeiench le 30-10-2003 à 12:54:16
Reply

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 ?


Message édité par bjone le 30-10-2003 à 14:39:06
Reply

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 :/
 
et c'est quoi le problème à avoir le cpu en mode économie d'énergie ?


 
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 :D J'ose pas trop l'contredire tu vois ^^

Reply

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.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed