我正在使用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是否每分钟调用一次以上。我所发现的让我困惑不解。每过一分钟,我就会在stdout上打印一些消息,比如说至少10条消息,但是这个变量每分钟只增加一次。
*截取*
每分钟左右检查新的一天
在递增之前
1分钟已过
每分钟左右检查新的一天
在递增之前
1分钟已过
*截取*
每分钟左右检查新的一天
在递增之前
2分钟已过
每分钟左右检查新的一天
在递增之前
2分钟已过
*截取*
它的行为就像文本被发送到10个(大约)不同的缓冲区,并在每分钟后立即打印出来。有没有人能告诉我为什么会这样,因为我很确定回调每分钟只会被调用一次。谢谢!
发布于 2009-07-13 09:33:25
我试着用下面的代码重现:
#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方法来处理事件!?你的主循环怎么样?
我知道这帮不了什么忙,但对我很管用...
https://stackoverflow.com/questions/1118227
复制相似问题