【问题标题】:Stop/Restart GLib.Timeout.Add();停止/重启 GLib.Timeout.Add();
【发布时间】:2014-07-11 13:23:26
【问题描述】:

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

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

【问题讨论】:

    标签: c# multithreading mono glib gtk#


    【解决方案1】:

    Glib 超时不支持,但这是我编写的一个计时器类,它模仿微软的计时器类。

    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;
    

    【讨论】:

      【解决方案2】:
      • 您可以使用全局变量来禁用它,可以在AskPython 函数中检查它,如果设置了则什么也不做。

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

        函数被反复调用,直到返回False,此时超时自动销毁,不再调用该函数。

        参考:glib.timeout_add

        如果您想再次启用它,请致电GLib.Timeout.Add

      【讨论】:

        猜你喜欢
        • 2015-05-20
        • 2018-02-15
        • 1970-01-01
        • 2013-06-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-14
        • 1970-01-01
        • 2013-06-06
        相关资源
        最近更新 更多