问题:等待定时器的时间是否会收到其它操作的影响(不包含等待定时器本身的操作函数)实际场景:程序执行流程如下:
  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执行过程中的某些因素或者优先级影响了等待定时器的重置,为什么第一次收到了影响,而之后又没有影响了。
并且我在另外一台机器上模拟现场条件(只模拟了大概流程的时间,而没有模拟串口操作),那么上述情况并没有出现。

解决方案 »

  1.   

    xxmmmx(踢踏) ( ) 信誉:105    Blog  2006-12-14 14:26:06  得分: 0  
     
     
       “线程1的执行时间大约70秒左右”和“1分09秒”时间很接近
      
     是的,我估计那个1分09秒就是线程1执行的时间。但为什么第二次之后,这种影响就没有了。
      

  2.   

    为什么不用delphi自带的线程类,TThread,
      

  3.   

    这种问题最郁闷,如果只是解决问题,我改进定时方式可以轻易解决,但这种问题出现了,还找不到为什么,偶会习惯性失眠。。TMD。
      

  4.   

    yi10000() ( ) 信誉:100    Blog  2006-12-14 14:31:18  得分: 0  
     
     
       为什么不用delphi自带的线程类,TThread,
      
     
    谢谢回复,这里应该不是问题的所在。对TThread类的VCL源码我还是比较熟悉的。
      

  5.   

    买个USB转串口,必要的设备还是需要装备一下的。
    不过USB转串口跟实际的串口还是有点区别的。
      

  6.   

    xxmmmx(踢踏) ( ) 信誉:105    Blog  2006-12-14 14:34:01  得分: 0  
     
     
       买个USB转串口,必要的设备还是需要装备一下的。
    不过USB转串口跟实际的串口还是有点区别的。
      
     
    USB转串口这个东西,我有,跟你说的一样,他和实际的使用有区别,对于一些232接口的仪表而言,这个东西不好用。