Wywoływanie funkcji co sekundę
Ostatnio zmodyfikowano 2022-01-07 14:08
Simlas1337 Temat założony przez niniejszego użytkownika |
Wywoływanie funkcji co sekundę » 2022-01-07 06:50:15 Hej, szukam rozwiązania, żeby wywołać funkcję co sekundę. Chciałem użyć funkcji sleep(), ale ona zamraża cały program. W javascript używałem czegoś takiego "setTimeout(function, milliseconds)", a w c++ nie jestem w stanie znaleźć podobnego rozwiązania, które nie blokuje całej aplikacji. void dodaj_pieniadze() { Gra::pieniadze = Gra::pieniadze + 12.0; dodaj_pieniadze(); }
|
|
nanoant20 |
» 2022-01-07 09:05:44 skorzystaj z bibliotek <chrono> i <thread> std::chrono::milliseconds timespan( 1000 ); std::this_thread::sleep_for( timespan );
|
|
pekfos |
» 2022-01-07 14:08:18 Żeby to działało tak jak chcesz to zrobić, musisz te oczekiwanie zrobić w osobnym wątku. Wtedy blokujesz tylko ten jeden wątek, nie resztę programu, czyli pewnie tylko główny wątek. Problem w tym że to jest złe rozwiązanie. Żeby działało poprawnie, musisz zapewnić synchronizację między wątkami, żeby móc użyć tej liczby pieniędzy. Dodatkowo takie obliczenia będą zawsze miały tendencję do zaniżania wyniku, bo czekanie wprowadza dodatni błąd. Poprawne rozwiązanie polega na mierzeniu czasu z użyciem jakiegoś zegara (do dokładności sekundowej wystarczy time()) i uwzględnianie upływu czasu w obliczaniu tej wartości pieniędzy. Zgaduję że gra jest w konsoli. Zamiast zmieniać wartość zmiennej co sekundę, prościej jest zmieniać wartość w momencie jej pobrania: int money = 0; time_t lastMoneyUpdate = 0;
int getMoney() { time_t now = time( NULL ); if( lastMoneyUpdate != 0 ) money += 12 *( now - lastMoneyUpdate ); lastMoneyUpdate = now; return money; } Gdy czas systemowy przejdzie do następnej sekundy, funkcja wykrywa różnicę w czasie i odpowiednio dodaje pieniądze. To nie jest dokładnie powiększanie co sekundę, bo jeśli wywołasz tą funkcję 10s po poprzednim wywołaniu, zostanie dodane od razu 120. Pamiętaj że musisz teraz wszędzie używać getMoney() by pobierać ilość pieniędzy. |
|
« 1 » |