问题:等待定时器的时间是否会收到其它操作的影响(不包含等待定时器本身的操作函数)实际场景:程序执行流程如下:
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、创建一个自动重置的等待定时器
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执行过程中的某些因素或者优先级影响了等待定时器的重置,为什么第一次收到了影响,而之后又没有影响了。
并且我在另外一台机器上模拟现场条件(只模拟了大概流程的时间,而没有模拟串口操作),那么上述情况并没有出现。
解决方案 »
- 为什么x 总提示 错误 value assigned to x never used
- Delphi+SQL 2000 操作主表总是提示XX字段被约束不能操作出错,快吐血了救命啊~!
- 请问如何执行存取过程
- 如何防止图象被截取?怎样用 API 的方式实现用鼠标拖动控件?
- Installshield Express 4所制作的安装程序的序列号校验之DLL?(如何用delphi编制?)
- 请问delphi的组件命名有没有标准啊?borland有没有官方的delphi7组件前缀标准啊?
- 请问如何在Delphi中克隆数据集
- 怎么在delphi中用摄像头拍照
- 这是一个口令加密的自定义函数,有谁能够解答每行代码的含义,要详细点.谢了
- 请问各位杀毒软件哪个好,哪个不好,请说明理由
- 显示*.DIB和*.RLE图片的问题,有知道的请进!!着急
- 我的自传
“线程1的执行时间大约70秒左右”和“1分09秒”时间很接近
是的,我估计那个1分09秒就是线程1执行的时间。但为什么第二次之后,这种影响就没有了。
为什么不用delphi自带的线程类,TThread,
谢谢回复,这里应该不是问题的所在。对TThread类的VCL源码我还是比较熟悉的。
不过USB转串口跟实际的串口还是有点区别的。
买个USB转串口,必要的设备还是需要装备一下的。
不过USB转串口跟实际的串口还是有点区别的。
USB转串口这个东西,我有,跟你说的一样,他和实际的使用有区别,对于一些232接口的仪表而言,这个东西不好用。