停止/重新启动GLib.超时.Add();
本文关键字:Add 超时 重新启动 GLib 停止 | 更新日期: 2023-09-27 18:12:34
此函数在GTK#中启动计时器。我希望能够随心所欲地开始和停止这一切。
void StartClock ()
{
GLib.Timeout.Add (1000, new GLib.TimeoutHandler (AskPython));
}
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
,请调用它。