【发布时间】:2009-07-13 08:12:45
【问题描述】:
我正在使用 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 个(左右)不同的缓冲区并在每分钟后一次打印出来。有人可以启发我并帮助我理解为什么会发生这种情况,因为我很确定回调每分钟只调用一次。谢谢!
【问题讨论】:
标签: c++ multithreading signals gtkmm