windows程序如何实现精准定时

有朋友问我,“小兵以太网测试仪”这个软件,是如何控制发包频率的。

我想想,干脆写一篇文章来聊聊这个问题吧。

windows下,每当一个程序设定的定时器时间到了,windows会给程序发送一个WM_TIMER消息。

根据著名的windows编程书籍《Windows程序设计》的描述(在第8章),

我们知道,windows的定时器有如下的缺陷:

1. 精度不高

windows98大概是55ms,Windows NT大概是10ms。

2. WM_TIMER消息可能无法及时处理

WM_TIMER消息和其他消息一样,存放在正常的消息队列之中。如果程序处理其他消息,用了太长的时间,就耽误了WM_TIMER消息的处理,从效果上看就相当于定时器来晚了。

3. WM_TIMER消息可能会有遗漏

这样一来,如果一个windows程序在时间方面有苛刻的要求(例如,测试仪之类的软件),怎么办呢。

“小兵以太网测试仪”采用的是如下的笨方法。

这种方法非常简单,但也确实有效。下面是此方法的伪代码。

interval=x; //所需的时间间隔

next_do_work_time=当前时间;

while (!need_stop)

{

do

{

cur_time=当前时间;

} while (!need_stop && cur_time<next_do_work_time);

if (need_stop) break;

DO_WORK();

next_do_work_time+=interval;

}

需要说明的是,这种方法是很消耗CPU的 :)

时间: 2024-10-11 11:28:46

windows程序如何实现精准定时的相关文章

Windows程序代码重构

代码重构:在程序功能实现之后,对代码进行一定规模的整理,使之符合"高内聚.低耦合"的软件设计原则,便于维护和使用. ①用函数封装消息处理代码--对Windows程序窗口函数中的每一个case程序段进行封装以形成一个消息处理函数,而在case中调用这个函数. ②利用数组或链表实现消息映射表进一步实现代码的隔离--因为窗口函数switch-case结构实质上实现的就是一个根据消息标识来查找消息处理代码的功能,故可以用消息映射表和一段查表程序来替代它,表中的每一项可以使用一个函数指针来指向消

编写的windows程序,崩溃时产生crash dump文件的办法

一.引言 dump文件是C++程序发生异常时,保存当时程序运行状态的文件,是调试异常程序重要的方法,所以程序崩溃时,除了日志文件,dump文件便成了我们查找错误的最后一根救命的稻草.windows程序产生dump文件和linux程序产生dump文件的方式不一样,linux默认是不让产生core dump文件,只要在用户自己的~/.bash_profile文件中增加 ulimit -S -c unlimited > /dev/null 2>&1 这样程序崩溃就可以产生可调试的core d

盘点那些快速打开windows程序的快捷键

很多时候,快捷键带给我们的不仅仅是快速,还能带给我们一种心灵上的满足感.试想一下,别人都在中规中矩的用鼠标点,一步步慢慢调出所需要程序,而你却可以直接通过一个快捷键就完成了,是不是感觉特别有成就呢?今天就给大家整理了打开windows程序的常用快捷命令,windows系统拥护者的朋友们赶紧来转走收藏吧. 注:开始菜单中的"运行"是通向程序的快捷途径,输入特定的命令后,即可快速的打开Windows的大部分程序. winver检查Windows版本 wmimgmt.msc 打开Window

MFC第一节-windows程序内部运行机制

一.窗口 设计窗口类时: 1 typedef struct _WNDCLASS{ 2 UINT style; //如水平.垂直变化是否重绘,禁用Close,检测双击 3 WNDPROC lpfnWndProc;//窗口过程函数句柄 4 int cbClsExtra;//类附加内存 5 int cbWndExtra;//窗口附加内存 6 HANDLE hInstance;//实例句柄 7 HANDLE hIcon;//图标 8 HCURSOR hCursor;//光标 9 HBRUSH hbrBa

为编写的Windows程序提升权限

1.要求以管理员身份运行 在vs工程属性中,Linker ---> Manifest File---> UAC Execution Level,选择requireAdministrator (/level='requireAdministrator')选项 2.在main函数开始时运行以下函数代码: BOOL WINAPI EnablePrivileges() { HANDLE hToken; TOKEN_PRIVILEGES tkp; if (!OpenProcessToken(GetCur

windows 程序的本体与操作系统之间的关系

1 WinMain(hInst,hPrev,--) 2 { 3 MSG msg; 4 RegisterClass(--); 5 CreateWindow(--); 6 ShowWindow(--); 7 UpdateWindow(--); 8 while(GetMessage(--)) 9 { 10 TranslateMessage(--); 11 DispatchMessage(--); 12 } 13 return msg.wParam; 14 } 15 16 Window Procedur

Windows程序调试系列: 使用VC++生成调试信息 转

Windows程序调试系列: 使用VC++生成调试信息 ZhangTao,[email protected], 译自 “Generating debug information with Visual C++”,Oleg Starodumov 出处: http://www.cnblogs.com/itrust/archive/2006/08/17/479603.aspx 引子 当我们使用调试器来调试程序时,我们希望能够单步调试到源代码中,在代码中设置断点,观察变量的值(包括用户自定义的复杂类型的

第一章 Windows程序内部运行机制(2)窗口和句柄

窗口是Windows应用程序中非常重要的元素.一个Windows应用程序至少有一个主窗口.窗口是Windows应用程序和用户进行交互的接口. 窗口通常包含标题栏.菜单栏.系统菜单.最小化框.最大化框.可调边框和滚动条. 窗口分为客户区和非客户区.应用程序通常在客户区中显示文字或绘制图形.标题栏.菜单栏.系统菜单.最小最大化框.可调边框统称为非客户区.非客户区主要由Windows系统来管理.应用程序主要管理客户区和外观及操作. 桌面也是一个窗口,称为桌面窗口,由windows系统创建和管理. 窗口

关于windows程序的学习及思考系列之一

1.窗口类的注册 a.windows程序中最简单的就是创建一个简单的窗口,而窗口程序的创建是基于窗口类的,窗口类决定了处理窗口消息的过程函数. b.一个窗口类可以用于创建多个窗口,也就是说窗口是窗口类的实例对象. c.所有的按钮窗口——包括下按按钮,复选框,单选框——都是基于窗口类来创建的.窗口类为这些窗口定义了窗口过程和一些其他的特性. d.当定义一个窗口的时候,我们还需要定义一些该窗口的特有的附加属性. 创建窗口(也就是创建一个类的实例),首先得先注册一个类,Windows中有Registe