2008-10-01 23 views
47

Próbuję dodać opóźnienie czasowe w programie C++ i zastanawiałem się, czy ktoś ma jakieś sugestie dotyczące tego, co mogę spróbować lub informacje, na które mogę spojrzeć?Jak dodać opóźnienie czasowe do programu C++?

Chciałbym mieć więcej szczegółów na temat tego, w jaki sposób wdrażam to opóźnienie czasowe, ale dopóki nie będę miał więcej informacji o tym, jak dodać opóźnienie w czasie, nie jestem pewien, w jaki sposób powinienem podjąć próbę wdrożenia tego.

+2

Zależy od platformy (OS) i posiadanych bibliotek. –

Odpowiedz

50

Win32: Sleep(milliseconds) jest to, co co

UNIX: usleep(microseconds) to, co chcesz.

Funkcja uśpienia() zajmuje tylko kilka sekund, co często jest zbyt długie.

+3

Istnieje również nanosajd(), jeśli funkcja uśpienia() nie daje wystarczającej rozdzielczości. –

+3

Należy pamiętać, że argumentem tych funkcji są MINIMALNE czasy uśpienia i NIE gwarantujemy, że wrócisz od razu, jeśli inny proces będzie obciążał procesor w tym czasie. – billjamesdev

+1

@Richard Harrison: Który nagłówek muszę dołączyć, aby funkcja sleep() działała? – Overflowh

5

Chcesz coś tak prostego jak

sleep(3); 
+1

nie działa w systemie Windows ... – PierreBdR

+0

To powinno. Jest prawie uniwersalny. W jakim języku/Compiler go wypróbowałeś? Czy zaimportowałeś wszystkie niezbędne biblioteki? –

+0

Nie mogłem zrozumieć, dlaczego nie została oznaczona jako odpowiedź lub nie została zbytnie przegłosowana. – ImranNaqvi

0

składnię:

void snu (unsigned sekund);

sleep() zawiesza wykonywanie na pewien interwał (sekundy). Z wezwaniem do uśpienia bieżący program zostaje zawieszony na wykonanie przez liczbę sekund określoną przez argument sekund. Odstęp jest dokładny tylko do jednej setnej sekundy lub do dokładności zegara systemu operacyjnego, w zależności od tego, która z tych wartości jest mniej dokładna.

3

Można również użyć select (2), jeśli chcesz precyzję mikrosekund (to działa na platformie, które nie mają usleep (3))

Poniższy kod będzie czekać na 1,5 sekundy:

#include <sys/select.h> 
#include <sys/time.h> 
#include <unistd.h>` 

int main() { 
    struct timeval t; 
    t.tv_sec = 1; 
    t.tv_usec = 500000; 
    select(0, NULL, NULL, NULL, &t); 
} 

`

19
#include <unistd.h> 
usleep(3000000); 

będzie to również spać przez trzy sekundy. Możesz jednak poprawić nieco liczby.

8

Należy pamiętać, że nie gwarantuje to, że ilość czasu, w którym wątek będzie spać, będzie zbliżona do okresu snu, gwarantuje jedynie, że ilość czasu, zanim wątek będzie kontynuować wykonywanie, będzie co najmniej żądaną ilością. Rzeczywiste opóźnienie zależy od okoliczności (zwłaszcza obciążenia danej maszyny) i może być o rząd wielkości większe niż pożądany czas uśpienia.

Nie podajemy także, dlaczego należy spać, ale należy zasadniczo unikać opóźnień jako metody synchronizacji.

2

Tak, sen jest prawdopodobnie funkcją wyboru tutaj. Zwróć uwagę, że czas przejścia do funkcji to najmniejszy czas, w którym wątek wywołujący będzie nieaktywny. Jeśli na przykład zadzwonisz do snu z 5 sekund, masz gwarancję, że wątek będzie spał przez co najmniej 5 sekund. Może wynosić 6 lub 8 lub 50, w zależności od tego, co robi system operacyjny. (Podczas optymalnego wykonywania OS będzie to bardzo bliskie 5.).
Inną przydatną cechą funkcji spania jest przejście w 0. To wymusi zmianę kontekstu z twojego wątku.

Niektóre informacje dodatkowe:
http://www.opengroup.org/onlinepubs/000095399/functions/sleep.html

0

Wiele inni pod warunkiem dobrych informacji do spania. Zgadzam się z Wedge, że sen rzadko jest najbardziej odpowiednim rozwiązaniem.

Jeśli śpisz, czekając na coś, to lepiej zaczekaj na tę rzecz/wydarzenie. Zobacz zmienne warunkowe.

Nie wiem, na jaki system operacyjny próbujesz to zrobić, ale do wątkowania i synchronizacji możesz zajrzeć do bibliotek Boost Threading (Boost Condition Varriable).

Przechodząc teraz w drugą skrajność, jeśli próbujesz poczekać na wyjątkowo krótkie okresy, jest kilka opcji stylu włamań. Jeśli pracujesz na jakiejś osadzonej platformie, na której nie jest realizowany "sen", możesz wypróbować prostą pętlę (dla/podczas itd.) Z pustym ciałem (należy uważać, aby kompilator go nie optymalizował). Oczywiście czas oczekiwania zależy od konkretnego sprzętu w tym przypadku. Dla naprawdę krótkich "czekań" możesz wypróbować zestaw "nop". Bardzo wątpię, że to jest to, o co prosisz, ale nie wiedząc, dlaczego musisz czekać, trudno jest być bardziej konkretnym.

0

W systemie Windows można dołączyć bibliotekę okien i użyć opcji "Uśpij (0);" spać program. Zajmuje wartość reprezentującą milisekundy.

63

Uaktualniona odpowiedź dla C++ 11:

Użyj sleep_for i sleep_until funkcje:

#include <chrono> 
#include <thread> 

int main() { 
    using namespace std::this_thread; // sleep_for, sleep_until 
    using namespace std::chrono; // nanoseconds, system_clock, seconds 

    sleep_for(nanoseconds(10)); 
    sleep_until(system_clock::now() + seconds(1)); 
} 

Z tych funkcji nie ma już potrzeby, aby nieustannie dodawać nowe funkcje dla lepszej rozdzielczości: sleep, usleep, nanosleep, itp. sleep_for i sleep_until są funkcjami szablonu, które mogą akceptować wartości dowolnej rozdzielczości za pośrednictwem typów chrono; godziny, sekundy, femtosekund itp

w C++ 14 można dodatkowo uprościć kod z dosłownych przyrostków dla nanoseconds i seconds:

#include <chrono> 
#include <thread> 

int main() { 
    using namespace std::this_thread;  // sleep_for, sleep_until 
    using namespace std::chrono_literals; // ns, us, ms, s, h, etc. 
    using std::chrono::system_clock; 

    sleep_for(10ns); 
    sleep_until(system_clock::now() + 1s); 
} 

Note, że rzeczywisty czas trwania snu zależy od implementacja: Możesz spać przez 10 nanosekund, ale implementacja może w końcu spać przez milisekundę, jeśli to najkrótsza z możliwych.

+0

Działa świetnie ... :) – Vorac

1

stwierdziliśmy, że "_sleep(milliseconds);" (bez cudzysłowów) działa dobrze dla Win32 jeśli zawierają chrono bibliotekę

Np:

#include <chrono> 

using namespace std; 

main 
{ 
    cout << "text" << endl; 
    _sleep(10000); // pauses for 10 seconds 
} 

upewnij się, że zawiera podkreślenia przed snem.

1

Można spróbować ten fragment kodu:

#include<chrono> 
#include<thread> 

int main(){ 
    std::this_thread::sleep_for(std::chrono::nanoseconds(10)); 
    std::this_thread::sleep_until(std::chrono::system_clock::now() + std::chrono::seconds(1)); 
} 
1

aby opóźnić wyjście w CPP dla ustalonym czasie, można użyć funkcji sleep() o tym pliku nagłówkowym windows.h składnię sleep() jest funkcją snu (time_in_ms) jak

cout<<"Apple\n"; 
Sleep(3000); 
cout<<"Mango"; 

wyjściowego. powyższy kod wyświetli Apple i poczeka 3 sekundy przed wydrukowaniem Mango.

Powiązane problemy