Bonjour,
je voudrais executer une action après X seconde mais sans mettre mon programme en pause. Comment faire ?
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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));
Dernière modification par Invité ; 30/09/2015 à 05h37.
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.
Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
Un peu de programmation réseau ?
Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.
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 genre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 } // ... }
Partager