如何在Gtk#中进行非重复超时?

时间:2015-12-05 14:46:04

标签: mono gtk#

我想在将来做一件事,但只有一次。 The docs for GLib.Timeout.Add说“委托被重复调用,直到它返回false”,所以我返回false,然后我从glib得到一个错误。

示例代码:

using System;

class foo {
  static void Main() {
    Gtk.Application.Init();

    uint t = GLib.Timeout.Add(1000, () => {
      Console.WriteLine("returning false from timeout");
      Gtk.Application.Quit();
      return false;
    });
    Console.WriteLine("timeout added with source id = {0}", t);

    Gtk.Application.Run();
  }
}

示例输出:

$ mono foo.exe
timeout added with source id = 6
returning false from timeout

(foo:19030): GLib-CRITICAL **: Source ID 6 was not found when attempting to remove it

如何在超时后停止重复而不会出现错误?

$ pkg-config --modversion gtk-sharp-3.0
2.99.3

请注意,错误消息显然出现在程序退出处,并且在我的实际程序中,它似乎在gc运行之前不会出现(如果我手动调用gc并等待终结器,我可以在超时后立即获取它)。

1 个答案:

答案 0 :(得分:0)

简短的回答,你不能。超时不会重复,因为它已被正确删除。这就是“错误”的来源,因为gtk运行时试图将超时配置两次。这个问题不仅仅是C#gtk实现,它是C gtk +库中的一个错误。有一种方法可以禁止gtk报告错误,但我不知道该怎么做。