2009-07-13 3 views
1

Ich arbeite an einem Plugin für eine kleinere Anwendung mit gtkmm. Das Plugin, an dem ich gerade arbeite, überprüft nach jeder Minute bestimmte Bedingungen (das Datum hat sich geändert und ein neuer Tag begonnen) und startet einige Aktionen, wenn die Bedingungen erfüllt sind. In dem Initialisierungsteil des Plugins habe ich folgendes Stück Code, Glib :: SignalTimeout und sigC++ verwendet:glibmm Timeout-Signal

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

wo testCounter ist ein Attribut in der Klasse definiert, die das Initialisierungsverfahren enthält und check_interval ist eine Konstante gleich bis 1 Minute. Alle anderen vorhandenen Variablen sind in der Klasse definiert, die den Initialisierungscode und die Callback-Methode enthält. Die checkNewDay Methode ist, wo die Bedingung geprüft wird und Maßnahmen ergriffen, wenn der Tag geändert hat:

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; } 

ich den kleinen Testcode setzen, oben dargestellt, bevor ich die eigentliche Aktion verwendet wird, zu testen, ob alles gut geht und Der checkNewDay wird nicht öfter als einmal pro Minute aufgerufen. Was ich gefunden habe Rätsel mich. Nach jeder verstreichenden Minute bekomme ich eine Anzahl von 10 Nachrichten (mindestens), die auf dem Standard ausgegeben werden, aber die Variable wird nur einmal pro Minute erhöht.

****** schnippeln ****

jede Minute für neuen Tag prüfen oder so

Vor Inkrementieren

1 Minuten

verstrichene

für neuen Tag überprüfen jede Minute oder so

Vor dem Inkrementieren

1 Minute abgelaufen

**** schnippeln ****

für neuen Tag überprüft jede Minute oder so

Vor

Erhöhen

2 Minuten

verstrichene

für neuen Tag Überprüfung jeden Minute oder so

Vor dem Inkrementieren

2 Minuten verstrichene

**** snip ******

Es verhält sich wie der Text auf 10 (oder so) und unterschiedliche Puffer auf einmal nach jeder Minute ausgedruckt gesendet wurde. Könnte mich jemand aufklären und mir helfen zu verstehen, warum das passiert, weil ich mir ziemlich sicher bin, dass der Rückruf nur einmal jede Minute aufgerufen wird. Vielen Dank!

Antwort

2

Ich habe versucht, mit dem folgenden Code zu reproduzieren:

#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(); 
} 

Es gibt (wie erwartet):

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 

Ich schlage vor, Sie mit einem einfachen Beispiel wie bei mir zu reproduzieren versuchen, durch eventuell fügen Sie hinzu, was spezifisch für Ihren Code ist.

Ich kann nicht sehen, warum es nicht funktionieren sollte, außer vielleicht, wenn Sie einige Glib/Gtkmm Methoden aufrufen, die Ereignisse viele Male verarbeiten? Wie ist deine Hauptschleife?

Ich weiß, dass dies nicht viel helfen, aber es funktioniert für mich ...

+0

ich reproduzierte etwas ähnliches, um Ihren Code und es funktioniert wie erwartet. Ich habe keinen Zugriff auf die Hauptschleife, weil ich ein Plugin in eine Anwendung schreibe, die von anderen erstellt wurde. Im Plugin sieht es so aus, als ob der Callback mehr als einmal bei Timeout aufgerufen wird. Was mich verwirrt ist, dass die Variable nicht jedes Mal nur dann erhöht wird, wenn sie es annimmt (siehe in der Ausdruckliste). Deshalb nehme ich an, dass der Callback nur einmal aufgerufen wird, aber die Ausgabe ist irgendwie dupliziert. Deshalb habe ich die Frage gestellt, weil ich nicht ganz verstehe, was das verursacht. Ich werde versuchen, den Quellcode der Apps zu sehen. – crazybyte

+0

@crazy: Vielleicht ein Log-Problem. Ich habe mit libs wie log4cplus gearbeitet. Basierend auf der Konfiguration können diese Protokollsysteme Protokolle duplizieren. Es gibt vielleicht so etwas wie die Ausgabe ist, stimme ich zu, wirklich komisch. Überprüfen Sie das Protokollsystem ... – neuro