1

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

4

1 回答 1

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

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

于 2009-07-13T09:33:25.057 回答