En mi caso me ayudó escribir S dormir y NO s leep - ¡muy extraño, pero funcionó!
Sleep
es una función de Windows.
Para Unix, considere usar nanosleep
(POSIX) o usleep
(BSD; obsoleto).
Un nanosleep
ejemplo:
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;
}
}
Necesitarás <time.h>
y <errno.h>
, disponible en C++ como <ctime>
y <cerrno>
.
usleep
es más simple de usar (simplemente multiplique por 1000, así que conviértalo en una función en línea). Sin embargo, es imposible garantizar que ese sueño ocurrirá durante un período de tiempo determinado, está obsoleto y debe extern "C" { }
-incluye <unistd.h>
.
Una tercera opción es usar select
y struct timeval
, como se ve en http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/ntdll/sync.c#l1204 (así es como Wine emula Sleep
, que en sí mismo es solo un contenedor para SleepEx
).
Nota :sleep
(minúscula 's'), cuya declaración está en <unistd.h>
, es no un sustituto aceptable, ya que su granularidad es de segundos, más gruesa que la del Sleep
de Windows ('s' mayúscula), que tiene una granularidad de milisegundos.
Con respecto a tu segundo error, ___XXXcall
es un token específico de MSVC++ (al igual que __dllXXX
, __naked
, __inline
, etc.). Si realmente necesita stdcall, use __attribute__((stdcall))
o similar para emularlo en gcc.
Nota :a menos que su destino de compilación sea un binario de Windows y está utilizando las API de Win32, el uso de o un requisito para stdcall
es una mala señal™.
#include <iostream>
#include <unistd.h>
using namespace std;
int main()
{
const long a=1000000;
long j;
cin >> j;
usleep(a*j);
puts("exit");
}
usa usleep()
En vez de dormir y no olvides incluir unistd.h
(No cunistd
)
Cómo usar usleep en un programa C++ en Linux:
Pon esto en un archivo llamado s.cpp
#include <iostream>
#include <unistd.h>
using namespace std;
int main() {
cout << "nitrate";
cout << flush;
usleep(1000000);
cout << "firtilizers";
return 0;
}
Compílelo y ejecútelo:
[email protected] ~/foo4/40_usleep $ g++ -o s s.cpp
[email protected] ~/foo4/40_usleep $ ./s
nitratefirtilizers
Imprimió 'nitrato', esperó 1 segundo y luego imprimió 'fertilizantes'