2009-07-13 9 views
1

Je travaille sur un plugin pour une application plus petite en utilisant gtkmm. Le plugin sur lequel je travaille vérifie certaines conditions (la date a changé et un nouveau jour commence) après chaque minute et commence certaines actions si les conditions sont vraies. Dans la partie d'initialisation du module d'extension Je le morceau de code suivant qui utilise Glib :: SignalTimeout et sigC++:signal de temporisation glibmm

testCounter = 0; 
sigc::slot<bool> tslot = sigc::mem_fun(*this, 
       &NoteOfDayFactory::checkNewDay); 
timeoutObj = Glib::signal_timeout() 
       .connect(tslot,CHECK_INTERVAL); 

où testCounter est un attribut défini dans la classe qui contient la méthode d'initialisation et CHECK_INTERVAL est une constante égale à 1 minute. Toutes les autres variables présentes sont définies dans la classe qui contient le code d'initialisation et la méthode de rappel. La méthode checkNewDay est l'endroit où la condition est testée et les mesures prises si le jour avait changé:

bool NoteOfDayFactory::checkNewDay() { 
    std::cout << "Checking for new day every minute or so" << std::endl; 
    std::cout << "Before incrementing" << std::endl; 
    for(int i = 0; i < 100000; i++); 
    counter++; 
    std::cout << counter << " minutes elapsed" << std::endl; 
    return true; } 

Je mets le petit code de test, présenté ci-dessus, avant je l'action réelle, pour tester si tout va bien et le checkNewDay n'est pas appelé plus d'une fois par minute. Ce que j'ai trouvé me dérange. Après chaque minute écoulée, je reçois un certain nombre de laisser disons 10 messages (au moins) imprimés sur la sortie standard, mais la variable n'augmente qu'une fois par minute.

****** **** snip

Vérification de nouveaux jour chaque minute ou

Avant incrémenter

1 minutes se sont écoulées

Vérification de nouveaux jour chaque minute ou si

Avant incrémenter

1 minute écoula

**** **** snip

Vérification de nouveaux jour chaque minute ou

Avant incrémenter

2 minutes se sont écoulées

vérification du nouveau jour chaque minute ou plus

Avant d'incrémenter

2 minutes se sont écoulées

**** snip ******

Il se comporte comme le texte a été envoyé à 10 (environ) différents tampons et imprimés à la fois après chaque minute. Est-ce que quelqu'un pourrait m'éclairer et m'aider à comprendre pourquoi cela se produit, parce que je suis à peu près sûr que le rappel n'est appelé qu'une fois par minute. Je vous remercie!

Répondre

2

J'ai essayé de reproduire avec le code suivant:

#include <iostream> 
#include <glibmm.h> 

unsigned counter = 0; 

bool checkNewDay() 
{ 
    std::cout << "Checking for new day ..." << std::endl; 
    counter++; 
    std::cout << "counter = " << counter << std::endl; 

    return true; 
} 


int main() 
{ 
    static const unsigned delayInMillis = 1000; 

    sigc::slot<bool> tslot = sigc::ptr_fun(&checkNewDay); 
    Glib::signal_timeout().connect(tslot, delayInMillis); 

    std::cout << "Starting Glib::MainLoop" << std::endl; 
    Glib::MainLoop::create(false)->run(); 
} 

Il produit (comme prévu):

Starting Glib::MainLoop 
Checking for new day ... 
counter = 1 
Checking for new day ... 
counter = 2 
Checking for new day ... 
counter = 3 
Checking for new day ... 
counter = 4 

Je vous suggère d'essayer de reproduire avec un exemple simple comme le mien, par finalement en ajoutant ce qui est spécifique à votre code.

Je ne vois pas pourquoi cela ne devrait pas fonctionner, sauf peut-être si vous appelez des méthodes Glib/Gtkmm qui traitent des événements plusieurs fois!? Comment est ta boucle principale?

Je sais que ce n'est pas beaucoup d'aide, mais ça fonctionne pour moi ...

+0

Je reproduit quelque chose de similaire à votre code et il fonctionne comme prévu. Je n'ai pas accès à la boucle principale car j'écris un plugin à une application créée par d'autres. Dans le plugin, il semble que le callback soit appelé plus d'une fois au timeout. Ce qui me dérange, c'est que la variable n'est pas incrémentée à chaque fois seulement lorsqu'elle le suppose (voir dans la liste imprimée). C'est pourquoi je suppose que le rappel n'est appelé qu'une seule fois mais la sortie est en quelque sorte dupliquée. C'est pourquoi j'ai posé la question car je ne comprends pas très bien ce qui en est la cause. Je vais essayer de voir le code source des applications. – crazybyte

+0

@crazy: peut-être un problème de journal. J'ai travaillé avec des libs comme log4cplus. Selon la configuration, ces journaux peuvent dupliquer les journaux. Il y a peut-être quelque chose comme ça car la sortie est, je suis d'accord, vraiment bizarre. Vérifiez le système de journal ... – neuro

Questions connexes