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. |
|
1aam2am1 |
» 2014-08-01 22:43:12 _sleep(1); usleep(); Sleep(); z dos.h jest chyba delay To działa jest tylko w milisecundach |
|
kubek3898 |
» 2014-08-01 23:15:27 Sprawdź rozwiązanie J. Grębosza z Symfonii C++. Proste, a może być przydatne: / *********************************************************************
void zwloka( int sekund ) { time_t poczatkowy_czas = time( NULL ); while( time( NULL ) - poczatkowy_czas < sekund ); } |
|
pekfos |
» 2014-08-02 00:08:36 std::this_thread::sleep_for(). |
|
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)? |
|
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); |
|
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: #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ć :/. |
|
pekfos |
» 2014-08-02 15:34:48 Pobierz MinGW od mingwbuilds i w instalatorze wybierz wątki posix. std::this_thread::sleep_for( std::chrono::seconds( 3 ) );
|
|
« 1 » 2 |