glibmm超时信号

时间:2009-07-13 08:12:46

标签: c++ multithreading signals gtkmm

我正在使用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。 我发现了什么困扰我。经过每一分钟后,我会在stdout上打印10条消息(至少),但变量每分钟只增加一次。

****** snip ****

每分钟检查新的一天

在递增之前

过了1分钟

每分钟检查新的一天

在递增之前

过去1分钟

**** snip ****

每分钟检查新的一天

在递增之前

过了2分钟

每分钟检查新的一天

在递增之前

过了2分钟

**** snip ******

它的行为类似于将文本发送到10个(或左右)不同的缓冲区,并在每分钟后立即打印出来。有人可以启发我并帮助我理解为什么会发生这种情况,因为我很确定回调每分钟只调用一次。谢谢!

1 个答案:

答案 0 :(得分:2)

我尝试使用以下代码重现:

#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方法多次处理事件!你的主循环怎么样?

我知道这没什么用,但它对我有用......