【发布时间】:2014-07-11 13:23:26
【问题描述】:
此函数在 GTK# 中启动一个计时器。我希望能够随心所欲地开始和停止。
void StartClock ()
{
GLib.Timeout.Add (1000, new GLib.TimeoutHandler (AskPython));
}
【问题讨论】:
标签: c# multithreading mono glib gtk#
此函数在 GTK# 中启动一个计时器。我希望能够随心所欲地开始和停止。
void StartClock ()
{
GLib.Timeout.Add (1000, new GLib.TimeoutHandler (AskPython));
}
【问题讨论】:
标签: c# multithreading mono glib gtk#
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;
【讨论】:
您可以使用全局变量来禁用它,可以在AskPython 函数中检查它,如果设置了则什么也不做。
否则,我认为这是 GLib 的正确方式。 AskPython 应该返回 false。
函数被反复调用,直到返回False,此时超时自动销毁,不再调用该函数。
如果您想再次启用它,请致电GLib.Timeout.Add。
【讨论】: