Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/07/2006, à 15:36

steph12358

Thread sous Anjuta+Gtkmm+Glade

Bonjour à tous

je développe sous Anjuta+Gtkmm+Glade pour les interfaces, une appli
sous ubuntu.

j'utilise dans mon appli un timer pour rafraîchir l'écran (ttes les "freq" secondes), fonction "flipImages"
et un autre pour effectuer d'autres opérations (toutes les secondes).

J'utilise un spinButton pour changer la fréquence "freq" de rafraîchissement, mais...
mon timer reste à 3 secondes d'intervalles...

voici mon code (extrait)

//valeur par défaut

dans mon .hh

SigC::Connection flipTimer;

dans mon .cc


freq=3   //3 secondes par défaut...

SigC::Connection flipTimer;
flipTimer = Glib::signal_timeout().connect(SigC::slot(*this, &fenFlip::flipImages), freq*1000);

plus loin dans une boucle appelée toutes les secondes (2nd timer) :

if (flipTimer.connected())
{
   //on déconnecte
   flipTimer.disconnect();

   //on redéfinit en changeant l'intervalle
   flipTimer = Glib::signal_timeout().connect(SigC::slot(*this, &fenFlip::flipImages), freq*1000);

   //On affiche la nouvelle valeur de refresh dans la barre de titre pour vérifier
   this->set_title("toutes les "+intToString(freq)+" seconde(s)");
}

La valeur de "freq" est bien changée mais le timer reste à 5 secondes d'intervalle.

Je suis dessus depuis 3 jours mais là, je cale !
Qqun a une idée? Merci

Hors ligne

#2 Le 25/07/2006, à 09:21

steph12358

Re : Thread sous Anjuta+Gtkmm+Glade

Bonjour, c'est moi à nouveau

Je simplifie l'énoncé :
Comment créer un timer "monTimer" appelant une fonction "maFonction" dans une fenetre "maFenetre", avec une périodicité "maPeriodicite",
puis en cours d'exécution, changer la périocidité du timer ?
ex: La périodicité peut être modifiée par l'utilisateur avec un slider ("potar").

//1000 pour une seconde d'intervalle d'exécution : 1000 ms = 1s
maPeriodicite = 1000;  //par défaut

SigC::Connection flipTimer;
monTimer = Glib::signal_timeout().connect(SigC::slot(*this, &maFenetre::maFonction), maPeriodicite );

Puis en cours d'exécution, ceci pour tenter de changer la periode du timer :


if (monTimer.connected())
{
   maPeriodicite = 5000;

   //on déconnecte
   monTimer.disconnect();

   //on redéfinit en changeant l'intervalle
   monTimer = Glib::signal_timeout().connect(SigC::slot(*this, &maFenetre::maFonction), maPeriodicite );

   //On vérifie le changement de valeur
   this->set_title("toutes les "+intToString(maPeriodicite /1000)+" seconde(s)");
}

Mais voilà ca ne marche pas :0(
On reste avec une péridiocité d'exécution de 1 seconde.

Quelqu'un a une idée ?

Hors ligne

#3 Le 28/07/2006, à 14:52

idroxid

Re : Thread sous Anjuta+Gtkmm+Glade

Le tout avec gtkmm 2.4 et donc sigc++ >= 2.0:
sigc::slot<bool> my_slot = sigc::bind(sigc::mem_fun(*this, &maFenetre::maFonction), m_timer_number);
sigc::connection conn = Glib::signal_timeout().connect(my_slot, maPeriodicite );
cf http://www.gtkmm.org/docs/gtkmm-2.4/docs/tutorial/html/ch20.html#id2536513