wake-up-neo.com

C++ - Fehler: In diesem Bereich wurde kein Ruhezustand angegeben

Ich verwende C++ in Ubuntu mit CodeBlocks, Boost 1.46 in GCC 4.7 [yield_k.hpp]

Ich bekomme diesen Fehler beim Kompilieren: 

error : Sleep was not declared in this scope

Code:

#include <iostream>
using namespace std;
int main() { 
  cout << "nitrate";
  cout << flush;
  sleep(1000);
  cout << "firtilizers";
  return 0;
}

Wie löse ich diesen Fehler? Ich möchte, dass das Programm für 1 Sekunde hängt.

15
Mahika

Sleep ist eine Windows-Funktion.

Verwenden Sie für Unix nanosleep (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>, die in C++ als <ctime> und <cerrno> verfügbar sind.

usleep ist einfacher zu verwenden (einfach mit 1000 multiplizieren, also Inline-Funktion verwenden). Es kann jedoch nicht garantiert werden, dass das Schlafen für eine bestimmte Zeitdauer stattfindet, es ist veraltet und Sie müssen extern "C" { }- <unistd.h> einschließen.

Eine dritte Möglichkeit ist die Verwendung von select und struct timeval (siehe http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/ntdll/). sync.c # l1204 (so emuliert wine Sleep, was selbst nur ein Wrapper für SleepEx ist).

Hinweis : sleep (Kleinbuchstaben 's'), dessen Deklaration in <unistd.h> steht, ist kein akzeptabler Ersatz, da seine Granularität Sekunden beträgt und gröber ist als die von Windows 'Sleep (Großbuchstaben'), die eine Granularität von Millisekunden aufweist.

Bezüglich Ihres zweiten Fehlers ist ___XXXcall ein MSVC++ - spezifisches Token (wie auch __dllXXX, __naked, __inline usw.). Wenn Sie wirklich stdcall brauchen, verwenden Sie __attribute__((stdcall)) oder ähnliches, um es in gcc zu emulieren.

Hinweis : Sofern Ihr Kompilierungsziel keine Windows-Binärdatei ist und Sie Win32-APIs verwenden, verwenden Sie oder eine Anforderung für stdcall ist A Bad Sign ™.

24
moshbear

So verwenden Sie usleep in einem C++ - Programm unter Linux:

Fügen Sie dies in eine Datei mit dem Namen 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 dann "Firtilizer".

13
Eric Leschinski

In meinem Fall hat es geholfen,Sleep und NOT s leep zu schreiben - sehr seltsam, hat aber funktioniert!

1
alex
#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() Ein Schlaf und Vergessen Sie nicht, unistd.h(Nicht cunistd) einzuschließen

1
user8435497