Nel mio caso ha aiutato scrivere S leep e NON s leep - molto strano, ma ha funzionato!
Sleep
è una funzione di Windows.
Per Unix, cerca di usare nanosleep
(POSIX) o usleep
(BSD; deprecato).
Un nanosleep
esempio:
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;
}
}
Avrai bisogno di <time.h>
e <errno.h>
, disponibile in C++ come <ctime>
e <cerrno>
.
usleep
è più semplice da usare (basta moltiplicare per 1000, quindi rendila una funzione inline). Tuttavia, è impossibile garantire che la sospensione si verifichi per un determinato periodo di tempo, è deprecato e devi extern "C" { }
-include <unistd.h>
.
Una terza scelta è usare select
e struct timeval
, come visto in http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/ntdll/sync.c#l1204 (questo è il modo in cui wine emula Sleep
, che a sua volta è solo un wrapper per SleepEx
).
Nota :sleep
('s' minuscola), la cui dichiarazione è in <unistd.h>
, non un sostituto accettabile, poiché la sua granularità è secondi, più grossolana di quella di Sleep
di Windows ('s' maiuscola), che ha una granularità di millisecondi.
Per quanto riguarda il tuo secondo errore, ___XXXcall
è un token specifico di MSVC++ (così come __dllXXX
, __naked
, __inline
, eccetera.). Se davvero hai bisogno di stdcall, usa __attribute__((stdcall))
o simile per emularlo in gcc.
Nota :a meno che la tua destinazione di compilazione non sia un and binario di Windows stai usando le API Win32, l'uso o un requisito per stdcall
è A Bad Sign™.
#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()
Invece di dormire e Non dimenticare di includere unistd.h
(Non cunistd
)
Come usare usleep in un programma C++ su Linux:
Inseriscilo in un file chiamato s.cpp
#include <iostream>
#include <unistd.h>
using namespace std;
int main() {
cout << "nitrate";
cout << flush;
usleep(1000000);
cout << "firtilizers";
return 0;
}
Compilalo ed eseguilo:
[email protected] ~/foo4/40_usleep $ g++ -o s s.cpp
[email protected] ~/foo4/40_usleep $ ./s
nitratefirtilizers
Ha stampato 'nitrato', ha aspettato 1 secondo, quindi ha stampato 'firtilizzatori'