сигнал тайм-аута glibmm

Я работаю над плагином для небольшого приложения, использующего gtkmm. Плагин, над которым я работаю, проверяет определенные условия (дата изменилась и начался новый день) каждую минуту и ​​запускает некоторые действия, если условия верны. В части инициализации плагина у меня есть следующий фрагмент кода, который использует Glib::SignalTimeout и sigc++:

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

где testCounter — атрибут, определенный в классе, который содержит метод инициализации, а CHECK_INTERVAL — константа, равная 1 минуте. Все остальные присутствующие переменные определены в классе, который содержит код инициализации и метод обратного вызова. В методе checkNewDay проверяется условие и предпринимаются действия, если день изменился:

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

Я поместил небольшой тестовый код, представленный выше, перед тем, как использовать реальное действие, чтобы проверить, все ли идет хорошо, а checkNewDay не вызывается чаще, чем раз в минуту. То, что я нашел, озадачило меня. По прошествии каждой минуты я получаю число, скажем, 10 сообщений (по крайней мере), напечатанных на стандартном выводе, но переменная увеличивается только один раз в минуту.

****** обрезать ****

Проверка нового дня каждую минуту или около того

Перед увеличением

Прошла 1 минута

Проверка нового дня каждую минуту или около того

Перед увеличением

Прошло 1 минута

**** вырезка ****

Проверка нового дня каждую минуту или около того

Перед увеличением

прошло 2 минуты

Проверка нового дня каждую минуту или около того

Перед увеличением

прошло 2 минуты

**** снип ******

Он ведет себя так, как будто текст был отправлен в 10 (или около того) разных буферов и распечатан сразу после каждой минуты. Может ли кто-нибудь просветить меня и помочь мне понять, почему это происходит, потому что я почти уверен, что обратный вызов вызывается только один раз в минуту. Спасибо!


person crazybyte    schedule 13.07.2009    source источник


Ответы (1)


Я попытался воспроизвести с помощью следующего кода:

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

Он выводит (как и ожидалось):

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

Я предлагаю вам попытаться воспроизвести его на простом примере, подобном моему, добавив в конечном итоге то, что специфично для вашего кода.

Я не понимаю, почему это не должно работать, если только, возможно, вы не вызовете некоторые методы Glib/Gtkmm, которые обрабатывают события много раз!? Как ваш основной цикл?

Я знаю, что это не очень помогает, но это работает для меня...

person neuro    schedule 13.07.2009
comment
Я воспроизвел что-то похожее на ваш код, и он работает так, как ожидалось. У меня нет доступа к основному циклу, потому что я пишу плагин к приложению, созданному другими. В плагине похоже, что обратный вызов вызывается более одного раза по тайм-ауту. Что меня озадачивает, так это то, что переменная не увеличивается каждый раз, а только тогда, когда это предполагается (см. в распечатке). Вот почему я предполагаю, что обратный вызов вызывается только один раз, но вывод каким-то образом дублируется. Вот почему я задал вопрос, потому что я не совсем понимаю, что вызывает это. Я постараюсь увидеть исходный код приложения. - person crazybyte; 13.07.2009
comment
@crazy: может быть, проблема с журналом. Я работал с такими библиотеками, как log4cplus. В зависимости от конфигурации эти системы журналов могут дублировать журналы. Возможно, что-то в этом роде, так как вывод, я согласен, действительно странный. Проверьте лог-систему... - person neuro; 13.07.2009