In meinem Fall hat es geholfen, S zu schreiben leep und NICHT s leep - sehr seltsam, aber funktioniert!
Sleep
ist eine Windows-Funktion.
Sehen Sie sich für Unix die Verwendung von nanosleep
an (POSIX) oder usleep
(BSD; veraltet).
Ein nanosleep
Beispiel:
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;
}
}
Sie benötigen <time.h>
und <errno.h>
, verfügbar in C++ als <ctime>
und <cerrno>
.
usleep
ist einfacher zu verwenden (multiplizieren Sie einfach mit 1000, machen Sie es also zu einer Inline-Funktion). Es ist jedoch unmöglich zu garantieren, dass dieses Schlafen für eine bestimmte Zeitdauer auftritt, es ist veraltet und Sie müssen extern "C" { }
- Fügen Sie <unistd.h>
ein .
Eine dritte Möglichkeit ist die Verwendung von select
und struct timeval
, wie in http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/ntdll/sync.c#l1204 zu sehen (so emuliert wine Sleep
, die selbst nur ein Wrapper für SleepEx
ist ).
Hinweis :sleep
(kleines 's'), dessen Deklaration in <unistd.h>
steht , ist nicht ein akzeptabler Ersatz, da seine Granularität Sekunden beträgt, gröber als die von Windows' Sleep
(großes 's'), das eine Granularität von Millisekunden hat.
Zu Ihrem zweiten Fehler, ___XXXcall
ist ein MSVC++-spezifisches Token (ebenso wie __dllXXX
, __naked
, __inline
, etc.). Wenn Sie wirklich stdcall benötigen, verwenden Sie __attribute__((stdcall))
oder ähnlich, um es in gcc zu emulieren.
Hinweis :es sei denn, Ihr Kompilierungsziel ist eine Windows-Binärdatei und Sie verwenden Win32-APIs, Verwendung von oder eine Anforderung für stdcall
ist ein schlechtes Zeichen™.
#include <iostream>
#include <unistd.h>
using namespace std;
int main()
{
const long a=1000000;
long j;
cin >> j;
usleep(a*j);
puts("exit");
}
Verwenden Sie usleep()
Anstatt zu schlafen und vergessen Sie nicht, unistd.h
einzufügen (Nicht cunistd
)
Wie man usleep in einem C++-Programm unter Linux verwendet:
Fügen Sie dies in eine Datei namens s.cpp
ein
#include <iostream>
#include <unistd.h>
using namespace std;
int main() {
cout << "nitrate";
cout << flush;
usleep(1000000);
cout << "firtilizers";
return 0;
}
Kompilieren Sie es und führen Sie es aus:
[email protected] ~/foo4/40_usleep $ g++ -o s s.cpp
[email protected] ~/foo4/40_usleep $ ./s
nitratefirtilizers
Es druckte „nitrat“, wartete 1 Sekunde und druckte dann „firtilizers“