【问题标题】:gtk text buffer insert waiting to print in text buffer until handler terminatesgtk 文本缓冲区插入等待在文本缓冲区中打印,直到处理程序终止
【发布时间】:2014-10-15 14:19:30
【问题描述】:

我正在使用以下 gtk+2.0 API: gtk_text_buffer_get_iter_at_offset(buffer, &iter, -1); gtk_text_buffer_insert(buffer, &iter, "text\n", -1); 在按钮处理程序中,缓冲区中的消息仅在相应处理程序完成终止时显示在 GUI 上,但我需要立即显示消息。 我在处理程序中有一些阻塞调用,直到这些调用被解除阻塞并且处理程序被终止消息不会显示在 GUI 上。

【问题讨论】:

    标签: gtk gtk3


    【解决方案1】:

    通常,小部件更新仅在主循环有机会处理小部件生成的事件后才可见。要强制立即处理事件,您可以手动运行所需的主循环迭代,如下所示:

    /* update the widget */
    ...
    
    /* force refresh */
    while (gtk_events_pending())
      gtk_main_iteration();
    

    这是一个相当常见的documented idiom,通常用于需要立即更新的小部件,例如进度条。不过,这种模式有一个缺点 - GTK 主循环的运行迭代也将处理 input 事件,即使是处理原始点击的同一个按钮的点击。

    如果您经常需要在完成处理程序之前运行主循环,则您可能错误地实现了事件驱动代码。理想情况下,处理程序中不应该有阻塞调用,如果有,它们应该在专用线程中运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多