Wiem, że sleep(x)funkcja POSIX sprawia, że program śpi przez x sekund. Czy istnieje funkcja umożliwiająca uśpienie programu przez x milisekund w C ++?
Należy pamiętać, że w Windows i tak Sleep()ma milisekundową precyzję , ale jej dokładność może być o rząd wielkości wyższa. Możesz myśleć, że śpisz przez 4 milisekundy, ale tak naprawdę śpisz przez 400.
John Dibling
5
@John Dibling: Myślę, że używa POSIX sleep, a nie Win32, Sleepbiorąc pod uwagę „x sekund”.
CB Bailey,
1
Chociaż C i C ++ mają różne zniekształcanie nazw, co może być źródłem błędów i niezgodności, w większości przypadków dobrze jest używać nagłówków C w C ++. Jeśli jednak chcesz mieć absolutną pewność, że nic nie pójdzie źle, #includenagłówek C wewnątrz extern "C" {}bloku. Ponadto, jeśli masz pliki źródłowe C i C ++ w tym samym projekcie, zdecydowanie zaleca się to zrobić, aby uniknąć problemów, zwłaszcza jeśli dołączasz te same nagłówki do obu rodzajów plików źródłowych (w takim przypadku jest to konieczne) . Jeśli masz projekt wyłącznie w języku C ++, może on po prostu działać bez problemu.
adam10603
2
@JohnDibling nie, nie 400 ms. Najgorszą precyzją, jaką mogłeś kiedykolwiek uzyskać, był system Windows 9x o GetTickCountrozdzielczości 55 ms; późniejsze wersje miały rozdzielczość 16ms lub mniejszą. Jeden z użytkowników pomyślał, że uzyskuje rozdzielczość 16ms z trybu uśpienia, ale następnie stwierdził, że Sleepsam był dość dokładny, a widoczna niedokładność była spowodowana użyciem GetTickCountdo pomiaru upływu czasu.
Qwertie,
Odpowiedzi:
457
Zauważ, że nie ma standardowego interfejsu API C dla milisekund, więc (w Uniksie) będziesz musiał się zadowolić usleep, co akceptuje mikrosekundy:
Musisz dołączyć odpowiednio <unistd.h> lub <Windows.h>.
gbmhunter
Tak, ale czy rzeczywista rozdzielczość czasu nie może wynosić 15-16 ms (nawet jeśli jednostka w wywołaniu wynosi 1 ms), a zatem minimalny czas powinien wynosić 15-16 ms?
Peter Mortensen,
33
W zależności od platformy możesz mieć usleeplub być nanosleepdostępny. usleepjest przestarzały i został usunięty z najnowszego standardu POSIX; nanosleepjest preferowany.
Jednym z problemów związanych z tym kodem jest to, że jest to zajęta pętla, która nadal będzie wykorzystywać 100% rdzenia jednego procesora. Funkcja uśpienia jest implementowana wokół wywołania systemu operacyjnego, które uśpi bieżący wątek i zrobi coś innego, i obudzi wątek dopiero po upływie określonego czasu.
Ismael
Masz rację - pochłonie 100% jednego rdzenia procesora. Oto przepisany kod przy użyciu funkcji uśpienia systemu - i wciąż jest on wieloplatformowy:
Bart Grzybicki
@BartGrzybicki wiem, że to stara odpowiedź, ale w Visual Studio 2017 na komputerze z systemem Windows #ifdef WIN32domyślnie nie jest to prawda.
kayleeFrye_onDeck
2
@kayleeFrye_onDeck Kod jest nieprawidłowy. Powinno być #ifdef _WIN32.
Contango,
1
@Contango Wiedziałem o tym! Ale nie kiedy to napisałem ... lol. Dzięki za kontynuację!
kayleeFrye_onDeck
17
nanosleepjest lepszym wyborem niż usleep- jest bardziej odporny na zakłócenia.
Nie używaj słowa „standard”, jeśli tak naprawdę nie masz tego na myśli. <concrt.h>to nie nagłówek Biblioteka Standard - może to być biblioteka platforma; w takim przypadku należy wyraźnie określić warunki wstępne.
Toby Speight
5
Na platformach z selectfunkcją (POSIX, Linux i Windows) możesz:
void sleep(unsignedlong msec){
timeval delay ={msec /1000, msec %1000*1000};int rc =::select(0, NULL, NULL, NULL,&delay);if(-1== rc){// Handle signals by continuing to sleep or return immediately.}}
Wydaje się, że nie można skompilować w VS2017 na komputerze z systemem Windows:error LNK2019: unresolved external symbol _select@20 referenced in function "void __cdecl sleep(unsigned long)" (?sleep@@YAXK@Z)
kayleeFrye_onDeck
@kayleeFrye_onDeck To się kompiluje. Po prostu nie łączy. Wyszukaj dokumenty systemu Windows.
Maxim Egorushkin,
jakiego nagłówka używasz na czas?
Totte Karlsson
@TotteKarlsson <sys/time.h>.
Maxim Egorushkin
4
Sleep(int)Metodą jest sposób na uśpienie twojego programu w C ++ . Plik nagłówkowy to#include "windows.h."
Na przykład:
#include"stdafx.h"#include"windows.h"#include"iostream"usingnamespace std;int main(){int x =6000;Sleep(x);
cout <<"6 seconds have passed"<< endl;return0;}
Czas snu jest mierzony w milisekundach i nie ma ograniczenia.
Co masz na myśli mówiąc, że nie ma limitu? Z pewnością ma limit, który wynosi 0xFFFFFFFE. Oczekiwanie na 0xFFFFFFFF po prostu nie przekroczy limitu czasu (co oznacza, że będzie czekać do zakończenia programu).
Izzy
Nie miałem na myśli tego tak, Izzy, przepraszam za nasze nieporozumienie. Miałem na myśli, że możesz wprowadzić dowolną dodatnią liczbę milisekund. Będzie więc czekać tyle milisekund, aby zamknąć program. Jeśli nie rozumiesz, powiedz tak, wyjaśnię ci więcej.
Phi
Tak, ale jaka jest rzeczywista rozdzielczość czasowa? Czy w niektórych przypadkach nie może to być 15-16 ms? Np. Jeśli użyjesz trybu Sleep (3), czy faktycznie będzie on spał przez 3 ms, czy zamiast tego będzie miał 15-16 ms?
Peter Mortensen,
3
Wybierz połączenie jest sposobem na uzyskanie większej precyzji (czas uśpienia można określić w nanosekundach).
Chociaż może to być cenna wskazówka do rozwiązania problemu, dobra odpowiedź pokazuje również rozwiązanie. Proszę edit dostarczyć przykładowy kod, aby pokazać to, co masz na myśli. Możesz też rozważyć napisanie tego jako komentarza.
Toby Speight
3
Użyj wzmocnienia asynchronicznego wątków wejścia / wyjścia, uśpienie przez x milisekund;
Co się stanie, jeśli spróbujesz spać przez 3 milisekundy? Czy zamiast tego będzie to 15-16 milisekund? Zmierzyłeś to?
Peter Mortensen,
1
Pytanie jest stare, ale udało mi się znaleźć prosty sposób, aby mieć to w mojej aplikacji. Możesz utworzyć makro C / C ++, jak pokazano poniżej, użyj go:
Sleep()
ma milisekundową precyzję , ale jej dokładność może być o rząd wielkości wyższa. Możesz myśleć, że śpisz przez 4 milisekundy, ale tak naprawdę śpisz przez 400.sleep
, a nie Win32,Sleep
biorąc pod uwagę „x sekund”.#include
nagłówek C wewnątrzextern "C" {}
bloku. Ponadto, jeśli masz pliki źródłowe C i C ++ w tym samym projekcie, zdecydowanie zaleca się to zrobić, aby uniknąć problemów, zwłaszcza jeśli dołączasz te same nagłówki do obu rodzajów plików źródłowych (w takim przypadku jest to konieczne) . Jeśli masz projekt wyłącznie w języku C ++, może on po prostu działać bez problemu.GetTickCount
rozdzielczości 55 ms; późniejsze wersje miały rozdzielczość 16ms lub mniejszą. Jeden z użytkowników pomyślał, że uzyskuje rozdzielczość 16ms z trybu uśpienia, ale następnie stwierdził, żeSleep
sam był dość dokładny, a widoczna niedokładność była spowodowana użyciemGetTickCount
do pomiaru upływu czasu.Odpowiedzi:
Zauważ, że nie ma standardowego interfejsu API C dla milisekund, więc (w Uniksie) będziesz musiał się zadowolić
usleep
, co akceptuje mikrosekundy:źródło
usleep
do tego użyć ?nanosleep
może być lepszym wyborem, ponieważusleep
jest przestarzały.W C ++ 11 możesz to zrobić za pomocą standardowych narzędzi bibliotecznych:
Jasne i czytelne, nie trzeba już zgadywać, jakie jednostki
sleep()
przyjmuje ta funkcja.źródło
sleep_for
do tego użyć ?Aby pozostać przenośnym, możesz użyć Boost :: Thread do spania:
Ta odpowiedź jest duplikatem i została wcześniej opublikowana w tym pytaniu . Być może znajdziesz tam również przydatne odpowiedzi.
źródło
boost::this_thread::sleep
dodaje punkt przerwania do kodu. boost.org/doc/libs/1_49_0/doc/html/thread/…W Uniksie możesz używać usleep .
W systemie Windows jest tryb uśpienia .
źródło
W zależności od platformy możesz mieć
usleep
lub byćnanosleep
dostępny.usleep
jest przestarzały i został usunięty z najnowszego standardu POSIX;nanosleep
jest preferowany.źródło
usleep()
jest zadeklarowane w<unistd.h>
, myląco,nanosleep()
jest zadeklarowane w<time.h>
/<ctime>
.Dlaczego nie skorzystać z biblioteki time.h? Działa w systemach Windows i POSIX:
Poprawiony kod - teraz CPU pozostaje w stanie IDLE [2014.05.24]:
źródło
#ifdef WIN32
domyślnie nie jest to prawda.#ifdef _WIN32
.nanosleep
jest lepszym wyborem niżusleep
- jest bardziej odporny na zakłócenia.źródło
usleep
, ale nienanosleep
. Powinieneś podać przykład użycia go w systemie Linux.Składnia:
Stosowanie:
źródło
#include <WinBase.h>
#include <windows.h>
Jeśli używasz MS Visual C ++ 10.0, możesz to zrobić za pomocą standardowych narzędzi bibliotecznych:
będziesz potrzebować:
źródło
<concrt.h>
to nie nagłówek Biblioteka Standard - może to być biblioteka platforma; w takim przypadku należy wyraźnie określić warunki wstępne.Na platformach z
select
funkcją (POSIX, Linux i Windows) możesz:Istnieją jednak obecnie lepsze alternatywy.
źródło
error LNK2019: unresolved external symbol _select@20 referenced in function "void __cdecl sleep(unsigned long)" (?sleep@@YAXK@Z)
<sys/time.h>
.Sleep(int)
Metodą jest sposób na uśpienie twojego programu w C ++ . Plik nagłówkowy to#include "windows.h."
Na przykład:
Czas snu jest mierzony w milisekundach i nie ma ograniczenia.
źródło
Wybierz połączenie jest sposobem na uzyskanie większej precyzji (czas uśpienia można określić w nanosekundach).
źródło
Użyj wzmocnienia asynchronicznego wątków wejścia / wyjścia, uśpienie przez x milisekund;
źródło
Pytanie jest stare, ale udało mi się znaleźć prosty sposób, aby mieć to w mojej aplikacji. Możesz utworzyć makro C / C ++, jak pokazano poniżej, użyj go:
źródło
Od C ++ 14 przy użyciu std, a także jego literałów numerycznych:
źródło
Jako zamiennik Win32 dla systemów POSIX:
źródło
nanosleep()
dousleep()
: ta ostatnia jest nieaktualny i został usunięty z najnowszym standardem POSIX.