Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 如何在Windows中使用计时器_Visual Studio_Visual C++ - Fatal编程技术网

Visual studio 如何在Windows中使用计时器

Visual studio 如何在Windows中使用计时器,visual-studio,visual-c++,Visual Studio,Visual C++,使用Windows API设置计时器的各种方法有哪些。每种方法的优缺点是什么 我使用DevStudio的C++ .,通常,看看你要使用的API,例如MFC、QT或GTK;他们都有定时器类 如果您不打算使用GUI API,我个人喜欢boost::timer(www.boost.org)Windows系统上有两个与计时器相关的函数:SetTimer和KillTimer(我知道,它们的名称是奇数-CreateTimer和DestroyTimer更合理,就像CreateWindow和DestroyWin

使用Windows API设置计时器的各种方法有哪些。每种方法的优缺点是什么


<>我使用DevStudio的C++ .

,通常,看看你要使用的API,例如MFC、QT或GTK;他们都有定时器类


如果您不打算使用GUI API,我个人喜欢boost::timer(www.boost.org)

Windows系统上有两个与计时器相关的函数:SetTimer和KillTimer(我知道,它们的名称是奇数-CreateTimer和DestroyTimer更合理,就像CreateWindow和DestroyWindow一样,但这是可用的)

SetTimer可以在两种模式中的一种模式下工作:计时器事件可以触发用户定义的回调,也可以向窗口发布消息。此函数的格式为:

timer_id = SetTimer (window, event_id, interval, callback);
要使用回调,请执行以下操作:

timer_id = SetTimer (NULL, NULL, interval_in_milliseconds, callback);
KillTimer (NULL, timer_id);
要将WM_计时器消息发送到窗口,请执行以下操作:

timer_id = SetTimer (window, event_id, interval_in_milliseconds, NULL);
在这两种情况下,调用线程都需要一个消息队列,因为这两个变量都发出WM_定时器消息,默认处理程序调用回调函数

根据您使用的操作系统,interval的值有上限和下限。更多细节

若要在完成计时器后释放计时器,请在提供窗口句柄的情况下执行以下操作:

KillTimer (window, event_id); // event_id is important!
如果您使用了回调:

timer_id = SetTimer (NULL, NULL, interval_in_milliseconds, callback);
KillTimer (NULL, timer_id);
单个窗口可以有多个与之关联的计时器,请为每个计时器使用不同的事件id。重用事件id会停止计时器的第一个实例,而不会发布WM\U timer消息

优点:相当容易使用。
缺点:间隔结束和WM_定时器消息处理之间的延迟,分辨率大,需要消息处理循环。

处理定时器的另一种方法是使用可等待定时器对象。这些不需要任何消息处理,不使用WM_定时器或回调。因此,它们有点复杂。了解Windows事件系统将很有帮助

定时器对象有三种类型:手动复位、同步和定期;还有四个函数用于处理计时器对象:CreateWaitableTimer、SetWaitableTimer、CancelWaitableTimer和CloseHandle(还有第五个函数,OpenWaitableTimer,但对很多人来说不太有用)。还有一组通知计时器何时过期所需的函数:WaitForSingleObject、MsgWaitForSingleObject、WaitForMultipleObjects和MsgWaitForMultipleObjects最有用

使用这些计时器的常用方法是:

CreateWaitableTimer (...)
SetWaitableTimer (...)
WaitForSingleObject (...)
CloseHandle (...)
将此与SetTimer进行比较-了解计时器是否已过期的唯一方法是轮询它,可以是在循环中轮询,也可以是使用infinte超时(即暂停线程,直到计时器过期)

优点:非常灵活,不需要消息队列。
缺点:难以使用

对于高分辨率计时器,请使用

@subbu:如果您真的想在此处获得帮助,请仔细阅读以下内容:。你的问题太广泛,很难理解你想做什么。显然,帮助你并不容易。你的问题听起来更像是一个要求“所以让任何示例代码都与之兼容”。礼貌一点,这里的50000多名员工也会对你很好。我认为这些计时器只是一次性的。QueryPerformanceCounter函数用于测量一系列代码执行所需的时间。如果您希望在一段时间后收到通知,那么就不需要轮询循环:do{sleep a bit}while(interval not expired)。