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!
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
@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