等待定时器的时间是否会收到其它操作的影响(不包含等待定时器本身的操作函数)

wudi_1982 2006-12-14 01:49:52
问题:等待定时器的时间是否会收到其它操作的影响(不包含等待定时器本身的操作函数)

实际场景:

程序执行流程如下:
1、创建一个自动重置的等待定时器
htime :=CreateWaitableTimer(nil,false,pchar('Mytime'));//
2、设置等待定时器的第一次绝对报时时间2006年12月14日 00:00:00,间隔30分钟报时
SetWaitableTimer(htime,liutc1,30*60*1000,nil,nil,true);
3、创建线程2并启动

线程2使用等待函数WaitForSingleObject配合等待定时器来调用线程1。

线程2执行部分的伪代码如下:
procedure TTesttimeThread.Execute;
begin
FreeOnTerminate := true;
while not Terminated do
if WaitForSingleObject(htime,INFINITE)=WAIT_OBJECT_0 then
线程1.create(false);
end;

线程2的优先级为默认的正常

线程1用来完成一组串口读写操作,此线程执行时,使用了串口操作的API函数创建了2个关于串口的内核对象,一个临界区对象,以及用gettickcount实现的延时函数。

线程1的流程如下:
1、打开两个串口1,2,并记录操作时间
2、延时1秒
3、循环10次下面的步骤4、5、6、7、8
4、拉高串口1的DTR电平
5、延时3秒
6、发送命令并读取串口2的数据(写和读之间有200ms操作延时,共两次)
7、延时3秒
8、使用Api SwitchToThread,使线程放弃CPU时间片,并使得优先级低的线程得到执行机会(主要用于VCL的界面的刷新)
9、释放资源,退出

注:线程1的相对优先级较高,线程1的执行时间大约70秒左右

实际场景中出现的问题:
按照上面的流程,线程1第一启动执行记录下的操作时间(线程1流程的1)应该为2006年12月14日 00:00:00,第二次启动时间应该为2006年12月14日 00:30:00,也就是按照设置的30分钟间隔报时

但在实际使用的过程中,程序依次记录下的启动时间为
2006年12月14日 00:00:00(第一次准确)
2006年12月14日 00:31:09(第二次到第一次的时间间隔在理论数值上多了1分09秒,也就时线程1执行的时间)
2006年12月14日 01:01:09(第三次和第二次的时间间隔又恢复正常,为30分钟)
2006年12月14日 01:31:09(以后的都是30分钟)

想请各位老大给看看,这是为什么,是不是线程1执行过程中的某些因素或者优先级影响了等待定时器的重置,为什么第一次收到了影响,而之后又没有影响了。
并且我在另外一台机器上模拟现场条件(只模拟了大概流程的时间,而没有模拟串口操作),那么上述情况并没有出现。
...全文
368 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanyel 2006-12-29
  • 打赏
  • 举报
回复
散分?
OO_is_just_P 2006-12-28
  • 打赏
  • 举报
回复
接分~
yhloveys 2006-12-28
  • 打赏
  • 举报
回复
偶也来接分哟
zuoansuifeng 2006-12-27
  • 打赏
  • 举报
回复
。。。UP一下
Comer 2006-12-27
  • 打赏
  • 举报
回复
???
hongqi162 2006-12-27
  • 打赏
  • 举报
回复
Done
hongqi162 2006-12-27
  • 打赏
  • 举报
回复
2
hongqi162 2006-12-27
  • 打赏
  • 举报
回复
1
huawei55 2006-12-26
  • 打赏
  • 举报
回复
天啊,楼上的天书看不懂 啊
hangzhou_hammer 2006-12-26
  • 打赏
  • 举报
回复
我来了
何鲁青 2006-12-24
  • 打赏
  • 举报
回复
末班车
madyak 2006-12-24
  • 打赏
  • 举报
回复
还没有结贴呀,赶紧接分
erpdrfsji 2006-12-24
  • 打赏
  • 举报
回复
接分!
才子鸣 2006-12-21
  • 打赏
  • 举报
回复
偶也來接分地
踢踏 2006-12-21
  • 打赏
  • 举报
回复
还不结,那偶再接一次~~~
  • 打赏
  • 举报
回复
晚辈来学习的..
wudi_1982 2006-12-21
  • 打赏
  • 举报
回复
考,还真快.
madyak 2006-12-21
  • 打赏
  • 举报
回复
接分来了
wudi_1982 2006-12-21
  • 打赏
  • 举报
回复
散分.要接分的赶快.
wudi_1982 2006-12-21
  • 打赏
  • 举报
回复
妈的,气死了,同样的代码,一句没改,这种情况在出现了那么一次之后,就再也不出现了.
加载更多回复(11)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧