IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Executer une action après X secondes


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Executer une action après X secondes
    Bonjour,

    je voudrais executer une action après X seconde mais sans mettre mon programme en pause. Comment faire ?

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    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).

  3. #3
    Invité
    Invité(e)
    Par défaut
    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.

  4. #4
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    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.

  5. #5
    Invité
    Invité(e)
    Par défaut
    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;
    		};
    	}

    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));
    Ca compile mais ca crash lorsque j'effectue l'action (mettre l'armure a mon personnage).
    Dernière modification par Invité ; 30/09/2015 à 05h37.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    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.

  7. #7
    Invité
    Invité(e)
    Par défaut
    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;
    }

  8. #8
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par dragonblood Voir le message
    Je suis pas sur de bien comprendre. Tu parle avec un Timer ?
    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
       }
       // ...
    }

Discussions similaires

  1. [ZF 1.11] Executer une action après le téléchargement d'un fichier
    Par reeda dans le forum Zend Framework
    Réponses: 13
    Dernier message: 30/10/2012, 13h29
  2. [AC-2003] comment executer une action apres detection activité du curseur
    Par chuspyto dans le forum IHM
    Réponses: 8
    Dernier message: 26/10/2010, 14h34
  3. Executer une action toute les x secondes.
    Par nuFox dans le forum C
    Réponses: 18
    Dernier message: 06/03/2008, 15h18
  4. [javascript]execution d'une fonction aprés n seconde
    Par ranell dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 14/04/2007, 17h04
  5. Executer une action après l'ouverture du form
    Par toure32 dans le forum Delphi
    Réponses: 5
    Dernier message: 22/03/2007, 19h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo