сигнал тайм-аута - PullRequest
       11

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

1 голос
/ 13 июля 2009

Я работаю над плагином для небольшого приложения, использующего 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 (как минимум) сообщений, напечатанных на stdout, но эта переменная увеличивается только раз в минуту.

****** snip ****

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

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

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

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

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

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

**** snip ****

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

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

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

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

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

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

**** snip ******

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

1 Ответ

2 голосов
/ 13 июля 2009

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

#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, которые многократно обрабатывают события!? Как твой основной цикл?

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

...