gtk_widget_add_tick_callback()和gtk_main_iteration()

时间:2017-03-08 19:56:56

标签: c++ gtk gtk3 gtkmm3

我有两个GTK窗口

  1. 运行动画的普通(主)窗口,在gtk_widget_add_tick_callback()注册的回调中绘制内容。

  2. 在某些时候创建了运行模态循环的辅助窗口:

    void show_modal() 
    {
       GtkWindow* gw = gtkwindow(this);
    
       if( parent() )
         gtk_window_set_transient_for(gw, gtkwindow( parent() ));
    
    
       gtk_widget_show(GTK_WIDGET(gw));
       gtk_window_set_modal(gw,TRUE);
       gtk_window_set_keep_above(gw,TRUE);
       this->update_window_state(gool::WINDOW_SHOWN);
    
       while( this->is_valid_window() )
       {
          if(this->_window_state == WINDOW_HIDDEN) break;
          if(this->_window_state == WINDOW_STATE_NA) break;
          gtk_main_iteration(); // gtk_main_iteration_do(true);
       }
    }
    
  3. 问题:主窗口中的动画可以正常工作,直到调用show_modal()。它显示为gtk_main_iteration();阻止由gtk_widget_add_tick_callback()函数添加的刻度。只要关闭辅助窗口,然后while() {gtk_main_iteration();}循环退出,主窗口中的动画就会重新开始运行。

    任何关于如何使动画变得友好的想法" GTK中的模态循环?

    更新:它显示为gtk_main_iteration();阻止不仅仅是勾选,而是除了"当前"之外的任何窗口的任何更新。 - 他们只是被冻结了。这种GTK行为的原因是什么?

    更新#2:

    gtk_dialog_run();的行为与gtk_main_iteration();完全相同 - 锁定除活动窗口之外的任何窗口上的任何更新。

2 个答案:

答案 0 :(得分:0)

似乎是定义:link

  

gboolean gtk_main_iteration (void);   运行mainloop的单次迭代。如果没有等待处理的事件,GTK + 将阻止,直到注意到下一个事件。如果您不想阻止查看gtk_main_iteration_do()或先检查gtk_events_pending()是否有任何待处理的事件。

如果您不想阻止,则说明建议使用gtk_main_iteration_do(FALSE)

  

gboolean gtk_main_iteration_do (gboolean blocking);   运行mainloop的单次迭代。如果没有可用的事件,则返回或阻止,具体取决于blocking的值:   TRUE如果您希望GTK +在没有待处理的事件时阻止

至于gtk_dialog_run:它还会按设计阻止 link

  

gint gtk_dialog_run (GtkDialog *dialog);   在递归主循环中阻止,直到对话框发出“响应”信号或被销毁。[...]

我读过有关使用多个线程解决此问题的人:在主线程中处理GUI并在另一个线程中执行后台工作。有一篇关于它的文章here可能有用。

答案 1 :(得分:0)

我假设从主要上下文中的回调或其他活动调用<div className="container"> <div className="row"> <div id="item1"></div> <div id="item2"></div> <div id="item3"></div> <div id="item4"></div> <div id="item5"></div> <div id="item6"></div> </div> </div> 。您可以尝试使用invokesignal_idle将您的模态窗口添加到主要上下文中。

这样<div className="container"> <div className="row"> <div id="item1"></div> <div id="item2"></div> <div id="item3"></div> </div> <div className="row"> <div id="item4"></div> <div id="item5"></div> <div id="item6"></div> </div> </div> 的执行就会结束。

show_modal