OVH Cloud OVH Cloud

sleep ?

12 réponses
Avatar
Lionel Allorge
Bonjour,

J'essaye de convertir un programme C++ de Windows =E0 Linux.
Or je tombe sur la fonction de pause :

Sleep(50);

Je souhaite la remplacer par une fonction =E9quivalente et mon livre de C=
=20
indique la fonction sleep() mais pas la librairie dans laquelle elle=20
serait contenue.

Toute aide sera la bienvenue.

D'avance merci.

Bonne continuation.

--
Lionel Allorge
Courriel : lionel.allorge@lunerouge.org
Lune Rouge : http://www.lunerouge.org
Film Libre : http://www.filmlibre.org
Terminal Damage : http://www.terminal-damage.org
<------>
"L'ennui dans ce monde, c'est que les idiots sont s=FBrs d'eux
et les gens sens=E9s pleins de doutes." Bertrand Russell

10 réponses

1 2
Avatar
Benoît Sibaud
Salut,

J'essaye de convertir un programme C++ de Windows à Linux.
Or je tombe sur la fonction de pause :

Sleep(50);

Je souhaite la remplacer par une fonction équivalente et mon livre de C
indique la fonction sleep() mais pas la librairie dans laquelle elle
serait contenue.


NOM
sleep - Endormir le processus pour une durée déterminée.

SYNOPSIS
#include <unistd.h>

unsigned int sleep (unsigned int nb_sec);

DESCRIPTION
sleep() endort le processus jusqu'à ce que nb_sec secondes se
soient
écoulées, ou jusqu'à ce qu'un signal non-ignoré soit reçu.


Attention le sleep() sous GNU/Linux est en secondes et celui sous
Windows en microsecondes je crois.

--
Benoît Sibaud

Avatar
Fabien LE LEZ
On Tue, 08 Jun 2004 15:59:07 -0500, Lionel Allorge
wrote:

J'essaye de convertir un programme C++ de Windows à Linux.
Or je tombe sur la fonction de pause :

Sleep(50);

Je souhaite la remplacer par une fonction équivalente


A ma connaissance, la gestion d'un temps précis (ici, 50 ms) est
difficile, voire impossible, en C++. Mieux vaut te tourner vers une
fonction spécifique à Linux.

--
;-)
FLL, Epagneul Breton

Avatar
Loïc Joly
Benoît Sibaud wrote:

Attention le sleep() [...] sous
Windows en microsecondes je crois.


Millisecondes.

--
Loïc

Avatar
Twxs
A ma connaissance, la gestion d'un temps précis (ici, 50 ms) est
difficile, voire impossible, en C++. Mieux vaut te tourner vers une
fonction spécifique à Linux.



question peut etre bete(je n'ai peut etre pas compris la question), mais
pourquoi ne pourrait on pas gerer un temps precis en C++?

Twxs

Avatar
Pierre Maurette
Twxs typa:


A ma connaissance, la gestion d'un temps précis (ici, 50 ms) est
difficile, voire impossible, en C++. Mieux vaut te tourner vers une
fonction spécifique à Linux.



question peut etre bete(je n'ai peut etre pas compris la question), mais
pourquoi ne pourrait on pas gerer un temps precis en C++?
Ce n'est pas C++ qui pose problème (même s'il n'existe rien de

portable), c'est Windows. D'une part il filtre l'accès au système
(selon les versions), et d'autre part il décide des tranches de temps
allouées à chaque tâche. Disons qu'en continuant à utiliser Windows
normalement, il ne faut pas espérer générer des timings plus précis
que de une dizaine à quelques dizaines de millisecondes. On peut
espérer beaucoup beaucoup mieux en bouclant en attendant une valeur de
compteur, mais rien n'en garanti le fonctionnement "à chaque coup".
Tout ceci n'a rien à voir avec le C++.
Ceci dit, Windows n'affiche clairement aucune prétention dans le
domaine du temps réel.
--
Pierre


Avatar
Hugues Delorme
"Lionel Allorge" a écrit dans le message de
news:ca4gsl$huo$
Bonjour,

J'essaye de convertir un programme C++ de Windows à Linux.
Or je tombe sur la fonction de pause :

Sleep(50);

Je souhaite la remplacer par une fonction équivalente et mon livre de C
indique la fonction sleep() mais pas la librairie dans laquelle elle
serait contenue.


J'ai répondu à cette question il y a peu dans un forum de développement C++.
J'ai testé la fonction suivante seulement sous Windows, tu peux me dire si
c'est ok avec Linux?
Ce qui suit est une fonction de pause qui fonction sous Windows et les
variantes d'Unix:

#ifndef _WIN32
# include <unistd.h>
#else
# include <windows.h>
#endif

#include <iostream>
#include <assert.h>

//Suspend execution of the calling process for ms milliseconds.
void wait_for (int ms)
{
assert (ms >= 0);//positive_argument
#ifndef _WIN32
usleep (ms);
#else
Sleep (ms);
#endif
}

//little test
int main ()
{
std::cout << "waiting 2 seconds ..." << std::endl;

wait_for (2000);

std::cout << "finished" << std::endl;

return 0;
}

Avatar
Amerio
J'essaye de convertir un programme C++ de Windows à Linux.
Or je tombe sur la fonction de pause :

Sleep(50);

Je souhaite la remplacer par une fonction équivalente


A ma connaissance, la gestion d'un temps précis (ici, 50 ms) est
difficile, voire impossible, en C++. Mieux vaut te tourner vers une
fonction spécifique à Linux.


Attention aussi : sous win32, Sleep a comme effet complementaire de
permettre au systeme de donner la main a d'autre thread. Si par ex le
programme est une boucle infini while(1) { traitement(); }, l'occupation CPU
sera de 100%. En rajoutant Sleep(1) dedans, l'occupation tombe a qlq %.
C'est aussi necessaire parfois en programmation multithread pour ne pas
qu'un des threads "bouffe" a lui seul tout le cpu.
Sleep ne fait donc pas que mettre le programme en sommeil... Sous unix, il
faudra peut etre l'associer à yield.


Avatar
K. Ahausse
"Amerio" a écrit dans le message de
news:40c6f42f$0$26912$

Attention aussi : sous win32, Sleep a comme effet complementaire de
permettre au systeme de donner la main a d'autre thread. Si par ex le
programme est une boucle infini while(1) { traitement(); }, l'occupation
CPU

sera de 100%.


Une chose m'étonne si tout le CPU est consacré à la boucle infinie, comme se
fait-il que les autres programmes continuent de marcher ?

Avatar
tib.motuelle
"Hugues Delorme" wrote in message news:<ca6pkk$qhb$...
"Lionel Allorge" a écrit dans le message de
news:ca4gsl$huo$
J'essaye de convertir un programme C++ de Windows à Linux.
Or je tombe sur la fonction de pause :
Sleep(50);

Je souhaite la remplacer par une fonction équivalente et mon livre de C
indique la fonction sleep() mais pas la librairie dans laquelle elle
serait contenue.


Ce qui suit est une fonction de pause qui fonction sous Windows et les
variantes d'Unix:

#ifndef _WIN32
# include <unistd.h>
#else
# include <windows.h>
#endif

#include <iostream>
#include <assert.h>

//Suspend execution of the calling process for ms milliseconds.
void wait_for (int ms)
{
assert (ms >= 0);//positive_argument
#ifndef _WIN32


usleep (ms * 1000); // *1000 pour convertir en microsecondes

#else
Sleep (ms);
#endif
}


usleep comme son nom l'indique prend en paramètre un nombre de
microsecondes, pas millisecondes. Il me semble aussi que, au moins sur
solaris, ce paramètre ne pas être >= 1 000 000. Regarde plutôt du coté
de nanosleep qui ne souffre pas de ces limitations et fait partie de
la norme POSIX.

Bertrand.


Avatar
Alexandre
question peut etre bete(je n'ai peut etre pas compris la question), mais
pourquoi ne pourrait on pas gerer un temps precis en C++?


parce que ça dépend de la plate-forme.


Twxs


1 2