将SetTimer()和KillTimer()移植到c#
本文关键字:SetTimer KillTimer | 更新日期: 2023-09-27 17:52:34
我正在尝试将一些代码从c++移植到c#。
我在c++代码中遇到了这个:
watchdogTimer = SetTimer(1,1000,NULL);
...
KillTimer(watchdogTimer);
这段代码是做什么的,如何将其移植到c#中?
谢谢。
您正在查看的CWnd::SetTimer
函数创建了一个将WM_TIMER
事件发送到窗口的计时器。这类似于。net中的System.Windows.Forms.Timer组件。它的行为与System.Timers.Timer
有些不同。这里有两个特别相关的区别:
Windows.Forms.Timer
调用UI线程上的事件处理程序。默认情况下,System.Timers.Timer
调用线程池线程的事件处理程序。你可以使用SynchronizingObject属性在UI线程上调用System.Timers.Timer
。
另一个区别是,它不可能遇到重入问题与Windows窗体定时器,因为Windows不允许多个WM_TIMER
消息来自同一个定时器在队列中,也不会在队列中放置一个WM_TIMER
消息,如果一个已经被处理。这通常是一件好事。
System.Timers.Timer
将允许重入。因此,如果计时器事件处理程序花费的时间长于计时器周期,则可以并发地处理同一计时器的多个事件。如果您的计时器周期是100毫秒,处理时间是150毫秒,那么在处理第一个通知时,您将获得另一个通知。如果你使用SynchronizingObject
在UI线程上强制回调,这可能会导致一大堆待处理的回调被排队。
这两个计时器的实现是完全不同的。Windows窗体计时器使用的是已经存在了20年的老式Windows计时器。这种类型的计时器需要一个窗口句柄和一个消息循环,因此只在GUI程序中使用。System.Timers.Timer
是System.Threading.Timer
的一个薄包装,它使用Windows线程池定时器。
假设您的应用程序是在MFC下编写的,SetTimer()方法属于CWnd类,负责设置windows计时器。相关文档可在http://msdn.microsoft.com/en-us/library/49313fdf(v=vs.80).aspx找到。我对。net知之甚少,但在谷歌上搜索了一下,找到了以下网址:http://msdn.microsoft.com/en-us/library/0tcs6ww8(v=VS.90).aspx.