Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Sleep()

Ostatnio zmodyfikowano 2014-08-06 23:09
Autor Wiadomość
An0nym8us
Temat założony przez niniejszego użytkownika
Sleep()
» 2014-08-01 22:34:32
Witam.

Na wstępie chciałbym zaznaczyć, że nie jestem "weteranem" C++, już raczej C#. Ale do rzeczy.

Mam problem: nie mogę znaleźć odpowiedniej dla mnie funkcji sleep() (odpowiedniej w sensie "przenośnej"/wieloplatformowej). Chciałbym korzystać z POSIX Threads, mam pobrane odpowiednie biblioteki, do kompilatora dodana jest opcja "-pthread", w headerze widnieje "#include <pthread.h>" i "#include <unistd.h>". Szukając pomocy w internecie, wiele razy natrafiałem na funkcję sleep() w unistd.h - jednak takowej funkcji nie posiadam, jedynie usleep() (a czytałem że jest ona przedawniona, co wyjaśniałoby dlaczego w ogóle nie "usypia" wątku). Nie chcę korzystać z WinAPI ponieważ pracuję nad projektem z zamiarem dystrybucji wieloplatformowej. Czytałem także o sleep() w time.h i errno.h (raz spotkałem się z sugestią, że w C++ należy użyć ctime i cerrno - je też sprawdziłem), jednak i tutaj kompilator zwraca brak tej funkcji :/. Korzystam z Windows 7 64-bit, MinGW i CodeBlocks. Zapewne rozwiązanie problemu jest banalne, dlatego prosiłbym o wyjaśnienie :). Pozdrawiam.
P-114907
1aam2am1
» 2014-08-01 22:43:12
_sleep(1);
usleep();
Sleep();
z dos.h jest chyba delay
To działa jest tylko w milisecundach
P-114910
kubek3898
» 2014-08-01 23:15:27
Sprawdź rozwiązanie J. Grębosza z Symfonii C++. Proste, a może być przydatne:

C/C++
/ *********************************************************************

// ********************************************************
// Dodatkowo zdefiniowałem funkcję zwloka, która powoduje w programie
// zwłokę czasowa o długości zadanej liczby sekund
// ********************************************************
void zwloka( int sekund )
{
    time_t poczatkowy_czas = time( NULL );
   
    // ta pętla wykonuje się dopóki nie minie zadana liczba sekund
    while( time( NULL ) - poczatkowy_czas < sekund ); // ciało puste
   
}
/************************************************************[/cpp] */
P-114911
pekfos
» 2014-08-02 00:08:36
std::this_thread::sleep_for().
P-114912
An0nym8us
Temat założony przez niniejszego użytkownika
» 2014-08-02 00:35:11
usleep() sprawdzałem pod kątem i milisekund, i nanosekund i mikrosekund - nie działa ;-;. _sleep i sleep nie ma (sprawdzałem unistd.h, tam też nie).

Co do rozwiązania z porównywaniem czasu - widziałem je, tylko że w sposób jaki ja chcę wykorzystać sleep() ten sposób jest całkowicie zawodny (chcę ograniczyć liczbę pętli przy renderingu bo procesor chodzi na 70%).

Co do trzeciego: nie ma u mnie this_thread. Zakładam że muszę mieć C++11?





Co do braku std::this_thread - rzeczywiście tego u mnie brak, jednak znalazłem to jako boost::this_thread i użycie sleep() oraz sleep_for() tutaj działa.

Już poza tematem: Boost to rozwinięcie wcześniejszych standardów C++ o C++11? I ew. czy w ogóle mogę używać C++11 w MinGW (jeśli nie to czy jest inny kompilator godny polecenia na Windows obsługujący C++11)?
P-114915
Monika90
» 2014-08-02 09:48:11
Albo ten twój mingw jeset bardzo stary, albo zapomniałeś włączyć c++11. Włącza się to flagą -std=c++11. Jeżeli masz najnowszą wersję mingw to możesz włączyć c++14 za pomocą -std=c++1y i cieszyć się taką składnią: std::this_thread::sleep_for(333ms);
P-114919
An0nym8us
Temat założony przez niniejszego użytkownika
» 2014-08-02 15:29:14
Mam GCC v. 4.8.1, MinGW pobrałem poprzez mingw32-get-setup (po czym w mingw-get wszystkie elementy ręcznie zaznaczyłem i zainstalowałem - pomijając Ada i Fortran). Próbowałem używać i -std=c++11 i -std=c++1y. Kompilator nie wywala błędów że takowej flagi nie ma, ale nadal zwraca "std::this_thread has not been declared". Kod mam taki:

C/C++
#include <stdio.h>
#include <iostream>
#include <chrono>
#include <thread>
#include <stdlib.h>

int main()
{
    std::this_thread::sleep_for( 333ms );
    return 0;
}
<Nie działa także bez 'ms'>



Zaznaczam jeszcze, że korzystam z CodeBlocks, MinGW własnoręcznie pobrane jest wykryte w ustawieniach CodeBlocks więc niby wszystko powinno działać :/.
P-114941
pekfos
» 2014-08-02 15:34:48
Pobierz MinGW od mingwbuilds i w instalatorze wybierz wątki posix.
C/C++
std::this_thread::sleep_for( std::chrono::seconds( 3 ) );
P-114943
« 1 » 2
  Strona 1 z 2 Następna strona