Robienie czegoś po czasie

0

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

if(warunek)
{
Strzel();
}

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

1

Daj sleepa i po problemie.

0
#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

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.

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.

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ł.

1
unsigned int passedTime = SDL_GetTicks();

if (SDL_GetTicks() - jakiś deley >= passedTime)
{
Strzel();
//resetujemy timer
passedTime = SDL_GetTicks();
}
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

1 użytkowników online, w tym zalogowanych: 0, gości: 1