2009-07-13 49 views
1

我正在为使用gtkmm的小型应用程序开发插件。我正在处理的插件会在每分钟后检查某些条件(日期已更改,新的一天开始),并在条件成立时开始一些操作。在插件的初始化部分我已在下面的代码段,它使用油嘴:: SignalTimeout和sigC++:glibmm超时信号

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(或左右)不同的缓冲液和每分钟之后,一次打印出来。有人能够启发我,并帮助我理解为什么会发生这种情况,因为我非常肯定每分钟只会调用一次回调。谢谢!

回答

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方法来处理事件多次!你的主循环如何?

我知道这不是太大的帮助,但它适用于我...

+0

我转载了类似于您的代码的东西,并且按预期方式工作。我无法访问主循环,因为我正在为其他人创建的应用程序编写插件。 在插件中,它看起来像在超时时多次调用回调。让我困惑的是,变量不是每次只有当它假设时才增加(参见打印输出列表)。这就是为什么我想这个回调函数只被调用一次,但输出结果是重复的。 这就是为什么我问这个问题,因为我不明白是什么造成了这个问题。 我会尝试看看应用程序的源代码。 – crazybyte 2009-07-13 10:15:07