Ответ 1
Sleep
- это функция Windows.
Для Unix изучите использование nanosleep
(POSIX) или usleep
(BSD, устаревшее).
A 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>
, доступные в С++ как <ctime>
и <cerrno>
.
usleep
проще использовать (просто умножьте на 1000, поэтому сделайте его встроенной функцией). Тем не менее, невозможно гарантировать, что спать будет происходить в течение определенного времени, оно устарело, и вам нужно extern "C" { }
-ключить <unistd.h>
.
Третий вариант заключается в использовании select
и struct timeval
, как показано в http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/ntdll/sync.c#l1204 (это то, как вино эмулирует Sleep
, который сам по себе является только оберткой для SleepEx
).
Примечание: Sleep
(строчные буквы '), декларация которых находится в <unistd.h>
, не является приемлемой заменой, так как ее гранулярность - секунды, более грубые, чем у Windows Sleep
(верхний регистр), который имеет степень детализации в миллисекундах.
Что касается вашей второй ошибки, ___XXXcall
является специфичным для MSVС++ токеном (как __dllXXX
, __naked
, __inline
и т.д.). Если вам действительно нужен stdcall, используйте __attribute__((stdcall))
или аналогичный, чтобы эмулировать его в gcc.
Примечание. Если ваша цель компиляции не является двоичным файлом Windows, и вы используете API Win32, использование или требование для stdcall
- это Bad Sign ™.