GTK +中的重复窗口失效:几个步骤后失败

问题描述:

我有一个计时器,它每秒调用一次方法(perform_step)。 perform_step做了一些计算并使我的窗口无效。这在初期效果很好,但经过少量迭代后,窗口的on_expose_event不会被触发。从调试中我发现窗口失效方法已被调用,但事件处理程序没有输入。GTK +中的重复窗口失效:几个步骤后失败

任何想法可能会导致这种情况?这里有一些事情我发现,可能会有所帮助:

  • perform_step计算较短,事情打破少迭代后。
  • 每次迭代次数相同后,事情就会崩溃。
  • 将鼠标移到窗口上可防止事情发生。如果我不断将鼠标移动到窗口上,事情将永远持续下去。它似乎“重置”柜台。如果事情在10次迭代之后崩溃,并且在第9次迭代中,我将鼠标移动到窗口上,那么在第19次迭代中事情就会中断。

下面的代码片段:

bool SimDisplay::on_button_press_event(GdkEventButton* event) { 
    Glib::signal_timeout().connect(sigc::mem_fun(*this, &SimDisplay::perform_step), 1000); 
} 

bool SimDisplay::perform_step() { 
    world->step(); 
    //on the last iteration this is called but on_expose_event is never reached 
    get_window()->invalidate(true); 
} 

bool SimDisplay::on_expose_event(GdkEventExpose* event) { 
    ... 
} 
+0

如果你计算/没有/使用'signal_timeout'会怎么样?它会正常工作吗? – senshikaze 2012-01-10 22:00:50

+0

@senshikaze我已经尝试了许多方法来执行计算,而不使用'signal_timeout',并且发现任何应该永远运行的方法在经过少量迭代之后就会崩溃。例如,我试过(不成功)在'on_pose_event'的底部调用'perform_step'。 – 2012-01-17 16:17:09

on_button_press_event()缺少return声明;确保你的所有处理程序都返回正确的东西。