gtk文本缓冲区插入等待在文本缓冲区中打印,直到处理程序终止

时间:2014-10-08 08:34:31

标签: gtk gtk3

我正在使用以下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上。

1 个答案:

答案 0 :(得分:1)

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

/* update the widget */
...

/* force refresh */
while (gtk_events_pending())
  gtk_main_iteration();

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

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