Dans mon cas, il a aidé à écrire S sommeil et PAS s leep - très étrange, mais a fonctionné !
Sleep
est une fonction Windows.
Pour Unix, envisagez d'utiliser nanosleep
(POSIX) ou usleep
(BSD ; obsolète).
Un nanosleep
exemple :
void my_sleep(unsigned msec) {
struct timespec req, rem;
int err;
req.tv_sec = msec / 1000;
req.tv_nsec = (msec % 1000) * 1000000;
while ((req.tv_sec != 0) || (req.tv_nsec != 0)) {
if (nanosleep(&req, &rem) == 0)
break;
err = errno;
// Interrupted; continue
if (err == EINTR) {
req.tv_sec = rem.tv_sec;
req.tv_nsec = rem.tv_nsec;
}
// Unhandleable error (EFAULT (bad pointer), EINVAL (bad timeval in tv_nsec), or ENOSYS (function not supported))
break;
}
}
Vous aurez besoin de <time.h>
et <errno.h>
, disponible en C++ en tant que <ctime>
et <cerrno>
.
usleep
est plus simple à utiliser (multipliez simplement par 1000, faites-en donc une fonction en ligne). Cependant, il est impossible de garantir que ce sommeil se produira pendant une durée donnée, c'est obsolète et vous devez extern "C" { }
-inclure <unistd.h>
.
Un troisième choix consiste à utiliser select
et struct timeval
, comme on le voit dans http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/ntdll/sync.c#l1204 (c'est ainsi que wine émule Sleep
, qui lui-même n'est qu'un wrapper pour SleepEx
).
Remarque :sleep
('s' minuscule), dont la déclaration est en <unistd.h>
, n'est pas un substitut acceptable, car sa granularité est de quelques secondes, plus grossière que celle du Sleep
de Windows ('s' majuscule), qui a une granularité de millisecondes.
Concernant votre deuxième erreur, ___XXXcall
est un jeton spécifique à MSVC++ (tout comme __dllXXX
, __naked
, __inline
, etc.). Si vous vraiment besoin d'un appel standard, utilisez __attribute__((stdcall))
ou similaire pour l'émuler dans gcc.
Remarque :sauf si votre cible de compilation est un binaire Windows et vous utilisez des API Win32, utilisez ou exigez stdcall
est un mauvais signe™.
#include <iostream>
#include <unistd.h>
using namespace std;
int main()
{
const long a=1000000;
long j;
cin >> j;
usleep(a*j);
puts("exit");
}
utilisez usleep()
Au lieu de dormir et N'oubliez pas d'inclure unistd.h
(Pas cunistd
)
Comment utiliser usleep dans un programme C++ sous Linux :
Mettez ceci dans un fichier appelé s.cpp
#include <iostream>
#include <unistd.h>
using namespace std;
int main() {
cout << "nitrate";
cout << flush;
usleep(1000000);
cout << "firtilizers";
return 0;
}
Compilez-le et exécutez-le :
[email protected] ~/foo4/40_usleep $ g++ -o s s.cpp
[email protected] ~/foo4/40_usleep $ ./s
nitratefirtilizers
Il a imprimé 'nitrate', a attendu 1 seconde, puis a imprimé 'firtilizers'