Bonjour,
je voudrais executer une action après X seconde mais sans mettre mon programme en pause. Comment faire ?
Version imprimable
Bonjour,
je voudrais executer une action après X seconde mais sans mettre mon programme en pause. Comment faire ?
Un thread qui se contente de boucler en attendant.
Ou alors, calculer l'heure de l'action, puis, régulièrement, vérifier qu'elle n'est pas passé, et si c'est le cas, faire l'action.
Cette seconde technique ne peut s'appliquer raisonnablement que si ton programme est constitué d'une boucle rapide (comme un jeu, par exemple).
Elle n'est pas recommandée, parce que ni lisible, ni souple (il n'est pas possible d'avoir facilement beaucoup d'action en attente).
bon j'ai trouvé ça
Code:
1
2
3
4
5 auto f = std::async(std::launch::async, [& ] { std::this_thread::sleep_for(std::chrono::seconds(5)); mPJ->MettreArmure(mInterface->mObjet); mSlotArmure = 1; });
seulement au bout de 5 seconde la ligne mPJ->MettreArmure(mInterface->mObjet); fait crashé le programme.
Il faut que la future f ne soit pas détruite avant la fin du code exécuté (celui de la lambda).
Sinon, il est possible que mPJ ou mInterface soient invalides (dangling pointer) ?
Si tu n'as pas de retour, utilise plutôt std::thread que std::future.
Voila mon code
Code:
1
2
3
4
5
6
7 std::function<void(void)> Listener::make_functor(std::shared_ptr<PJ> mPJ, std::shared_ptr<Interface> mInterface, bool &mSlotArmure) { return[mPJ, mInterface, mSlotArmure](){ std::this_thread::sleep_for(std::chrono::seconds(5)); mPJ->MettreArmure(mInterface->mObjet); mSlotArmure = true; }; }
Ca compile mais ca crash lorsque j'effectue l'action (mettre l'armure a mon personnage).Code:
1
2 //Et l'appel à async : auto f = std::async(std::launch::async, this->make_functor(std::shared_ptr <PJ>(mPJ), std::shared_ptr <Interface>(mInterface), mSlotArmure));
Salut,
si ça crash, en debug tu as une callstack qui t'indiquera où.
Parce que là en l'état on pourra juste absolument pas t'aider.
Sinon puisqu'on parle d'un jeu, justement la 2° option proposée par leternel est un classique.
Je suis pas sur de bien comprendre. Tu parle avec un Timer ?
faire un truc du genre;
timer.reset
faireAction=1
--------------------------------------------
if(timer.getSeconds> 5 && faireAction=1){
--- Faire Action----
faireAction=0;
}
Quelques chose du genreCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 struct Action { Time executeTime; std::function<void()> action; }; std::set<Action> work; // à trier par heure croissante d'éxécution while(1) { // les itérations doivent être courtes / fréquentes auto currentTime = getTime(); auto it = work.end(); while(!work.empty() && (it = work.first())->executeTime < currentTime) { // au moins une action dans la liste, et il est temps de l'éxécuter it->action(); // on l'exécute work.erase(it); // puis la supprime de la liste } // ... }