停止/重新启动GLib.超时.Add();

本文关键字:Add 超时 重新启动 GLib 停止 | 更新日期: 2023-09-27 18:12:34

此函数在GTK#中启动计时器。我希望能够随心所欲地开始和停止这一切。

void StartClock ()
 {
    GLib.Timeout.Add (1000, new GLib.TimeoutHandler (AskPython));
 }

停止/重新启动GLib.超时.Add();

Glib timeout不支持这一点,但这里有一个我编写的计时器类,它模仿了微软的计时器类。

public delegate void TimerElapsedHandler (object sender, TimerElapsedEventArgs args);
public class TimerElapsedEventArgs : EventArgs
{
    DateTime signalTime;
    public TimerElapsedEventArgs () {
        signalTime = DateTime.Now;
    }
}
public class Timer
{
    private bool _enabled;
    public bool enabled {
        get {
            return _enabled;
        }
        set {
            _enabled = value;
            if (_enabled)
                Start ();
            else
                Stop ();
        }
    }
    protected uint timerId;
    public event TimerElapsedHandler TimerElapsedEvent;
    public uint timerInterval; 
    public bool autoReset;
    public Timer () : this (0) { }
    public Timer (uint timerInterval) {
        _enabled = false;
        this.timerInterval = timerInterval;
        autoReset = true;
        timerId = 0;
    }
    public void Start () {
        _enabled = true;
        timerId = GLib.Timeout.Add (timerInterval, OnTimeout);
    }
    public void Stop () {
        _enabled = false;
        GLib.Source.Remove (timerId);
    }
    protected bool OnTimeout () {
        if (_enabled) {
            if (TimerElapsedEvent != null)
                TimerElapsedEvent (this, new TimerElapsedEventArgs ());
        }
        return _enabled & autoReset;
    }
}

用法:

Timer t = new Timer (1000);
t.TimerElapsedEvent += (sender, args) => {
    Console.WriteLine (args.signalTime.ToString ());
};
t.enabled = true;
  • 您可以使用全局变量禁用可以在AskPython函数中检查的变量,如果设置了该变量,则不执行任何操作。

  • 否则,我认为这是GLib的正确方式。AskPython应返回false

    函数会被反复调用,直到它返回False,这时超时会被自动破坏,函数将不会被再次调用。

    参考:glib.timeout_add

    如果您想再次启用GLib.Timeout.Add,请调用它。