- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试将一些代码从 C++ 移植到 C#。
我在 C++ 代码中遇到过这个:
watchdogTimer = SetTimer(1,1000,NULL);
...
KillTimer(watchdogTimer);
这段代码在做什么,如何将其移植到 C#?
谢谢。
最佳答案
您正在查看的 CWnd::SetTimer
函数创建了一个计时器,该计时器将 WM_TIMER
事件发送到窗口。这类似于 System.Windows.Forms.Timer .NET 中的组件。它的行为与 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 窗体计时器使用旧样式 Windows timers已经存在了 20 年。这种类型的定时器需要一个窗口句柄和一个消息循环,因此只在 GUI 程序中使用。 System.Timers.Timer
是 System.Threading.Timer
的精简包装器,它使用 Windows Thread Pool Timers .
关于c# - 将 SetTimer() 和 KillTimer() 移植到 C#?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5749925/
背景 MFC CWnd::SetTimer调用 WinAPI 的 SetTimer简单地。 _AFXWIN_INLINE UINT_PTR CWnd::SetTimer(UINT_PTR nIDEve
Timestamp[] lastreply = new Timestamp[100]; replyr = lastreplyr[i].getTime(); System.out.println("Re
感谢您的帮助!其主要目标是停止计时器。但它不起作用。我知道这不起作用,因为我从另一个函数调用局部变量,但如果我将该变量声明为全局变量,则 setTime 会自动启动,这不是我想要的。如何解决这个问题,
在我的一个项目中,我需要高效地安排要反复执行的不同操作,每个操作都有自己的时间间隔。 我一直在想,当我使用 SetTimer函数,后台发生了什么? 是否创建了新线程?它是否在后台运行并占用我的 CPU
我编写的代码在窗口未聚焦时检测按键: // MainHamsterDlg.cpp : implementation file #include "stdafx.h" #include "MainHam
我有一个无窗口计时器(没有 WM_TIMER),它只在给定的时间段过去后触发一次回调函数。它作为 SetTimer()/KillTimer() 实现。时间段足够小:100-300 毫秒。 对于每个如此
代码如下: function _niceTime($minute){ $m = $minute - 5; $date = new DateTime();
下面的代码将日期设置为 2015 年 6 月 7 日午夜。为什么?我的时区是 UTC-07:00 格雷格 Calendar HuntStart = Calendar.getIns
我对SetTimer()函数感到困惑。 SetTimer()具有三个参数: SetTimer(1,2000,Timerflow); 但是,我已经看到了另一个带有四个参数的SetTimer版本: Set
目前我正在尝试在 VBA 中实现一个计时器类。为此,我使用了 Windows API 的 SetTimer 和 KillTimer 函数...... 这是来自 Msdn 的界面: UINT_PTR
我已经基于 Java 版本创建了一个 JavaScript 版本的 Little Man Computer,网址为 http://www.atkinson.yorku.ca/~sychen/resea
Calendar lastEditDate = Calendar.getInstance(); lastEditDate.setTime(rs.getD
此代码导致输出 1。当 setTime 的参数是添加到 1970 年 1 月 1 日午夜的毫秒数时,为什么会这样?当然应该为 0 吗? var d = new Date(); d.setTime(0)
有什么方法可以获取由 SetTimer 函数创建的计时器的当前进度? 最佳答案 这是 Hans 评论的一个实现。单击该按钮会显示距离下一个预定(预期)WM_TIMER 消息的剩余时间。通过在 Debu
这个问题在这里已经有了答案: Can I use a SetTimer() API in a console C++ application? (6 个答案) 关闭 9 年前。 我有以下程序。我想知
我的 C++ 应用程序有一个无窗口计时器,用于定期清理从未(也永远不会)完全处理的潜在通信数据。问题是永远不会调用回调函数。我的类构造函数在返回之前执行以下代码: if ( (this->m_
我需要定时器每 1 秒启动一次功能。 我试过SetTimer,我的代码: const UINT_PTR TIMER_ID = 1000; DWORD DownloadThread() { Se
使用 SetTimer 时这样: SetTimer(hWnd, IDT_TIMER_LONGPROCESSING, 2000, (TIMERPROC) NULL); DoSomethingElse()
我尝试使用 SetTimer API 每隔 X 分钟调用一个函数。所以,我写了这段测试代码 void f() { printf("Hello"); } int main() { SetTimer(
当我尝试使用 Windows SetTimer 函数时,它会为计时器生成一个 IDEvent,即使我已经指定了一个! 这个: SetTimer(0,999,10000,@timerproc); 在:
我是一名优秀的程序员,十分优秀!