使用GTK#(GDK2)进行UI更新时,例如更改标签文字,设置按钮可见性等,我是否应该使用Gdk.Threads.AddTimeout
或Gdk.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;
});
答案 0 :(得分:1)
如果您需要在特定时间段后发生某些事情,则超时回调是合适的。一个例子是在文本字段中闪烁光标(不是你应该自己实现)。
一旦主循环完成执行其他所有准备就绪的操作,就会调用空闲超时。如果你只是一次调用它的区别是优先级。如果你有一些其他事件由主循环处理,那么在空闲处理程序中执行它会保证另一件事先发生。
当您返回true并获得重复回调时,差异变得更加明显。如果你在空闲回调中执行此操作,最终会使用尽可能多的CPU,因为操作系统会让你,但假设每次回调都很快,你的UI仍会保持响应。如果你使用超时执行此操作,则可以获得更可预测的行为。
我认为这会更难以触及UI的唯一原因是它默认为更高的优先级,并且可能会延迟绘制事件。优先级DEFAULT_IDLE< HIGH_IDLE(绘图)< DEFAULT。