首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >glibmm超时信号

glibmm超时信号
EN

Stack Overflow用户
提问于 2009-07-13 08:12:46
回答 1查看 3.5K关注 0票数 1

我正在使用gtkmm为一个较小的应用程序开发一个插件。我正在开发的插件每分钟检查一次特定的条件(日期已经改变,新的一天开始了),如果条件为真,它会启动一些操作。在插件的初始化部分,我有以下使用Glib::SignalTimeout和sigc++的代码:

代码语言:javascript
复制
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方法用于测试条件,并在日期发生变化时执行操作:

代码语言:javascript
复制
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条消息,但是这个变量每分钟只增加一次。

*截取*

每分钟左右检查新的一天

在递增之前

1分钟已过

每分钟左右检查新的一天

在递增之前

1分钟已过

*截取*

每分钟左右检查新的一天

在递增之前

2分钟已过

每分钟左右检查新的一天

在递增之前

2分钟已过

*截取*

它的行为就像文本被发送到10个(大约)不同的缓冲区,并在每分钟后立即打印出来。有没有人能告诉我为什么会这样,因为我很确定回调每分钟只会被调用一次。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-07-13 09:33:25

我试着用下面的代码重现:

代码语言:javascript
复制
#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();
}

它的输出(如预期):

代码语言:javascript
复制
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方法来处理事件!?你的主循环怎么样?

我知道这帮不了什么忙,但对我很管用...

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1118227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档