【问题标题】:glibmm timeout signalglibmm 超时信号
【发布时间】:2009-07-13 08:12:45
【问题描述】:

我正在使用 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 个(左右)不同的缓冲区并在每分钟后一次打印出来。有人可以启发我并帮助我理解为什么会发生这种情况,因为我很确定回调每分钟只调用一次。谢谢!

【问题讨论】:

    标签: c++ multithreading signals gtkmm


    【解决方案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 方法!?你的主循环怎么样?

    我知道这没有多大帮助,但它对我有用......

    【讨论】:

    • 我复制了一些与您的代码类似的东西,它按预期工作。我无法访问主循环,因为我正在为其他人创建的应用程序编写插件。在插件中,看起来回调在超时时被多次调用。让我感到困惑的是,变量并不是每次只在它假设的时候才递增(参见打印输出列表)。这就是为什么我认为回调只被调用一次但输出以某种方式重复。这就是我问这个问题的原因,因为我不太明白是什么原因造成的。我会尝试查看应用程序源代码。
    • @crazy:可能是日志问题。我使用过像 log4cplus 这样的库。根据配置,这些日志系统可能会重复日志。我同意,输出可能有类似的东西,真的很奇怪。检查日志系统...
    猜你喜欢
    • 2010-10-07
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 2017-04-12
    • 2012-09-03
    • 1970-01-01
    相关资源
    最近更新 更多