V mém případě pomohlo napsat S skok a NE s leep – velmi zvláštní, ale fungovalo to!
Sleep
je funkce Windows.
Pro Unix se podívejte na použití nanosleep
(POSIX) nebo usleep
(BSD; zastaralé).
A nanosleep
příklad:
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;
}
}
Budete potřebovat <time.h>
a <errno.h>
, dostupný v C++ jako <ctime>
a <cerrno>
.
usleep
je jednodušší na použití (stačí vynásobit 1000, takže je to funkce inline). Není však možné zaručit, že k tomuto spánku dojde po určitou dobu, je zastaralý a musíte extern "C" { }
-include <unistd.h>
.
Třetí možností je použít select
a struct timeval
, jak je vidět na http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/ntdll/sync.c#l1204 (takto víno emuluje Sleep
, což je samo o sobě jen obal pro SleepEx
).
Poznámka :sleep
(malé 's'), jehož deklarace je v <unistd.h>
, není přijatelná náhrada, protože její zrnitost je sekundová, hrubší než u Windows' Sleep
(velké 's'), které má přesnost v milisekundách.
Pokud jde o vaši druhou chybu, ___XXXcall
je token specifický pro MSVC++ (stejně jako __dllXXX
, __naked
, __inline
, atd.). Pokud opravdu potřebujete stdcall, použijte __attribute__((stdcall))
nebo podobně, abyste jej emulovali v gcc.
Poznámka :pokud váš cíl kompilace není binární soubor Windows a používáte Win32 API, použití nebo požadavek na stdcall
je 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");
}
použijte usleep()
Místo spánku a Nezapomeňte zahrnout unistd.h
(Ne cunistd
)
Jak používat usleep v programu C++ na linuxu:
Vložte to do souboru s názvem s.cpp
#include <iostream>
#include <unistd.h>
using namespace std;
int main() {
cout << "nitrate";
cout << flush;
usleep(1000000);
cout << "firtilizers";
return 0;
}
Zkompilujte jej a spusťte:
[email protected] ~/foo4/40_usleep $ g++ -o s s.cpp
[email protected] ~/foo4/40_usleep $ ./s
nitratefirtilizers
Vytiskl 'dusičnan', počkal 1 sekundu a pak vytiskl 'firtilizers'