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
verstrichenefü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öhen2 Minuten
verstrichenefü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!
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
@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