Robienie czegoś po czasie

Robienie czegoś po czasie
JA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Witam! Jak mógłbym zrobić coś w stylu

Kopiuj
if(warunek)
{
Strzel();
}

Chodzi dokładnie o To, że co np. 3 sekundy robi się jakąś rzecz.

szweszwe
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 1694
1

Daj sleepa i po problemie.

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
0
Kopiuj
#include <iostream>
#include <chrono>
#include <thread>
#include <mutex>
#include <condition_variable>

using namespace std::chrono_literals;

int f()
{
    std::this_thread::sleep_for(10s); //change value here to less than 1 second to see Success
    return 1;
}

int f_wrapper()
{
    std::mutex m;
    std::condition_variable cv;
    int retValue;

    std::thread t([&m, &cv, &retValue]() 
    {
        retValue = f();
        cv.notify_one();
    });

    t.detach();

    {
        std::unique_lock<std::mutex> l(m);
        if(cv.wait_for(l, 1s) == std::cv_status::timeout) 
            throw std::runtime_error("Timeout");
    }

    return retValue;    
}

int main()
{
    bool timedout = false;
    try {
        f_wrapper();
    }
    catch(std::runtime_error& e) {
        std::cout << e.what() << std::endl;
        timedout = true;
    }

    if(!timedout)
        std::cout << "Success" << std::endl;

    return 0;
}

tutaj masz przyklad

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
0

Jakiś event loop by się przydał. Możesz też robić to z osobnego wątku, ale jako nowicjusz będziesz miał z tym same problemy, lepiej będzie jak ogarniesz co to są eventloopy i jak się z nich korzysta.

JA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

To chyba w złym dziale posta dałem :P. Wiem jak działają eventy, loopy itp. Tylko moja sprawa wydała się tak łatwa do rozwiązania że nie chciałem innego działu zaśmiecać. Potrzebuje zrobić coś na zasadzie takiej jak pokazałem, gdzie w warunku biorę np.

Kopiuj
if  ( SDL_GetTicks () > 5000 ) {
Strzel();
}

Wykona się to tylko raz, Bo tylko raz get ticks będzie wynosiło 5000, A ja chciałbym żeby wykonywało się to od nowa i nowa... albo inaczej. Żeby strzał działał czemu czas, tylko z opóźnieniem się wykonywał.

JW
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
1
Kopiuj
unsigned int passedTime = SDL_GetTicks();

if (SDL_GetTicks() - jakiś deley >= passedTime)
{
Strzel();
//resetujemy timer
passedTime = SDL_GetTicks();
}
JA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

O coś takiego mi chodziło. Jeszcze za bardzo nie wiem dlaczego tak to działa, Ale rozrysuje sobie na kartce i się dowiem :D. Dzięki wielkie

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.