私の場合、 S と書くのに役立ちました リープとNOT s リープ - 非常に奇妙ですが、うまくいきました!
Sleep
は Windows 関数です。
Unix の場合は、nanosleep
の使用を検討してください (POSIX) または usleep
(BSD; 非推奨).
nanosleep
例:
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;
}
}
<time.h>
が必要です および <errno.h>
、C++ で <ctime>
として利用可能 と <cerrno>
.
usleep
の方が簡単に使用できます (1000 を掛けるだけなので、インライン関数にします)。ただし、スリープが一定時間発生することを保証することは不可能であり、非推奨であり、extern "C" { }
する必要があります。 -include <unistd.h>
.
3 番目の選択肢は、select
を使用することです。 と struct timeval
http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/ntdll/sync.c#l1204 に見られるように (これは、wine が Sleep
をエミュレートする方法です) 、それ自体は SleepEx
の単なるラッパーです ).
注意 :sleep
(小文字の 's')、その宣言は <unistd.h>
にあります 、ではない その粒度は秒単位であり、Windows の Sleep
よりも粗いため、許容可能な代替品です。 (大文字の「s」)、ミリ秒単位の粒度です。
2 番目のエラー ___XXXcall
について MSVC++ 固有のトークンです (__dllXXX
と同様) 、 __naked
、 __inline
など)。あなたが本当に stdcall が必要です。__attribute__((stdcall))
を使用してください または同様に gcc でエミュレートします。
注意 :コンパイル ターゲットが Windows バイナリ and でない限り Win32 API を使用している、stdcall
の使用または要件 は悪い兆候™です。
#include <iostream>
#include <unistd.h>
using namespace std;
int main()
{
const long a=1000000;
long j;
cin >> j;
usleep(a*j);
puts("exit");
}
usleep()
を使用 睡眠の代わりに unistd.h
を含めることを忘れないでください (cunistd
ではありません )
Linux の C++ プログラムで usleep を使用する方法:
これを s.cpp
というファイルに入れます
#include <iostream>
#include <unistd.h>
using namespace std;
int main() {
cout << "nitrate";
cout << flush;
usleep(1000000);
cout << "firtilizers";
return 0;
}
コンパイルして実行します:
[email protected] ~/foo4/40_usleep $ g++ -o s s.cpp
[email protected] ~/foo4/40_usleep $ ./s
nitratefirtilizers
「硝酸塩」を出力し、1 秒待ってから「肥料」を出力しました