glibmm超时信号
问题描述:
我正在为使用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(或左右)不同的缓冲液和每分钟之后,一次打印出来。有人能够启发我,并帮助我理解为什么会发生这种情况,因为我非常肯定每分钟只会调用一次回调。谢谢!
答
我试图再现与下面的代码:
#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方法来处理事件多次!你的主循环如何?
我知道这不是太大的帮助,但它适用于我...
我转载了类似于您的代码的东西,并且按预期方式工作。我无法访问主循环,因为我正在为其他人创建的应用程序编写插件。 在插件中,它看起来像在超时时多次调用回调。让我困惑的是,变量不是每次只有当它假设时才增加(参见打印输出列表)。这就是为什么我想这个回调函数只被调用一次,但输出结果是重复的。 这就是为什么我问这个问题,因为我不明白是什么造成了这个问题。 我会尝试看看应用程序的源代码。 – crazybyte 2009-07-13 10:15:07