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

Wywoływanie funkcji co sekundę

Ostatnio zmodyfikowano 2022-01-07 14:08
Autor Wiadomość
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.

C/C++
void dodaj_pieniadze() {
   
   
Gra::pieniadze = Gra::pieniadze + 12.0;
   
// Poczekajsekunde
   
dodaj_pieniadze();
}
P-179187
nanoant20
» 2022-01-07 09:05:44
skorzystaj z bibliotek <chrono> i <thread>
C/C++
std::chrono::milliseconds timespan( 1000 );
std::this_thread::sleep_for( timespan );
P-179188
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:
C/C++
int money = 0;
time_t lastMoneyUpdate = 0;

int getMoney()
{
   
time_t now = time( NULL );
   
   
// Jeśli poprzedni czas jest zerowy, to jest to pierwsze wywołanie - nic nie ma do zrobienia.
   
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.
P-179189
« 1 »
  Strona 1 z 1