用于GTK主线程上UI更新的AddTimeout或AddIdle?

时间:2016-04-28 10:16:43

标签: c# gtk gtk# gdk

使用GTK#(GDK2)进行UI更新时,例如更改标签文字,设置按钮可见性等,我是否应该使用Gdk.Threads.AddTimeoutGdk.Threads.AddIdle

The GDK2 documentation声明AddIdle

  

添加要在没有更高优先级事件待处理时调用的函数。

因此AddTimeout似乎会提供更具响应性的更新。但文档说明:

  

请注意,由于处理过程,超时功能可能会延迟   其他活动来源。因此,不应该依赖它们来准确   定时。

这使我相信空闲和超时都是相互响应的(在运行代码时它们似乎是这样)。

我正在研究的一些代码中的注释表明,Timeout会导致更新更快,但更难以触及UI,但我找不到任何来支持这一点。

作为一般规则,我应该使用哪些方法在主线程中执行GTK更新?

Threads.AddTimeout(0, 0, () =>
    {
         // do something;
         return false;
    });

VS

Threads.AddIdle(0, () =>
    {
        // do something;
        return false;
    });

1 个答案:

答案 0 :(得分:1)

如果您需要在特定时间段后发生某些事情,则超时回调是合适的。一个例子是在文本字段中闪烁光标(不是你应该自己实现)。

一旦主循环完成执行其他所有准备就绪的操作,就会调用空闲超时。如果你只是一次调用它的区别是优先级。如果你有一些其他事件由主循环处理,那么在空闲处理程序中执行它会保证另一件事先发生。

当您返回true并获得重复回调时,差异变得更加明显。如果你在空闲回调中执行此操作,最终会使用尽可能多的CPU,因为操作系统会让你,但假设每次回调都很快,你的UI仍会保持响应。如果你使用超时执行此操作,则可以获得更可预测的行为。

我认为这会更难以触及UI的唯一原因是它默认为更高的优先级,并且可能会延迟绘制事件。优先级DEFAULT_IDLE< HIGH_IDLE(绘图)< DEFAULT。