【求助】关于高精度多媒体定时器与线程问题,谢谢了

时间:2021-12-22 19:35:08
各位朋友大家好,最近工程遇到这样一个问题,我要实时读取传感器数据,然后对采集到的数据来控制阀门的开关,压力大就要关几个,高又要开几个阀门,反复循环等等。

想法:
1.想用自带的OnTimer定时器,感觉这个会比较慢,读取数据是要延迟。

2.目前想采用多媒体定时器,精度1ms,应该就不会出现跳帧现象。

这种项目可以不用多线程来完成吗?没有做过多线程的程序。一个线程去读取传感器数据,一个线程来根据数据来开关电磁阀。

高精度多媒体定时器不知道能不能实现这样的功能呢?

14 个解决方案

#1


顶上去看看

#2


开个线程不停的读就行了,发现状态改变就开关阀门

#3


引用 2 楼 fallingstar08 的回复:
开个线程不停的读就行了,发现状态改变就开关阀门

哦,遇到这种问题,必须还得采用多线程才行吧。一个线程不停的读取,另外一个线程开关阀门。

#4


实时性要求高的场合 建议使用硬件来做,
进程 线程都有会被阻塞的危险

#5


引用 4 楼 zgl7903 的回复:
实时性要求高的场合 建议使用硬件来做,
进程 线程都有会被阻塞的危险


哦,好的,不过目前硬件只能达到这种程度,看样子只有用多线程来做了,应该2个线程就足够了吧

#6


开线程是比较理想的办法!

#7


如果处理数据的过程耗时,再高精度的定时器也没用,多线程也解决不了问题

#8


引用 6 楼 czydxj 的回复:
开线程是比较理想的办法!

行,我打算用多线程来做~我就是一个线程普通的读取,不改变数据。另外一个线程做开关阀门。

#9


引用 7 楼 redui 的回复:
如果处理数据的过程耗时,再高精度的定时器也没用,多线程也解决不了问题


我数据不用处理,一个线程只不停的读取数据。另外一个线程根据读到数据来开关阀门。

#10


你开关阀门的操作耗时长么?
如果时间时间很短可以忽略不计的话感觉就开一个线程就够了。

线程里不断读取数据,读到后马上就去操作,然后返回继续读。

不然2个线程交互可能有点麻烦吧

#11


引用 10 楼 morebread 的回复:
你开关阀门的操作耗时长么?
如果时间时间很短可以忽略不计的话感觉就开一个线程就够了。

线程里不断读取数据,读到后马上就去操作,然后返回继续读。

不然2个线程交互可能有点麻烦吧


谢谢你的建议,我是这样做的,你看看

1.先点按钮,按钮里先发命令(3条命令),很快的,这样就开了3个阀门。

2.在OnTimer里实读取数据
  if(a>2)
  {关掉一个或2个阀门}

3.到达一定的数值后,关闭剩下的阀门

最后这个按钮工作完成。

#12


工控软件一般都用多线程来弄的
我一般专门用一个线程来监测传感器(数字输入)的变化,监测到跳变后,立即触发另外一个阀门开关执行的线程(该线程启动后一直处于等待状态,WaitforSignal(eventExecute,INFINIT))

#13


引用 12 楼 wqhua 的回复:
工控软件一般都用多线程来弄的
我一般专门用一个线程来监测传感器(数字输入)的变化,监测到跳变后,立即触发另外一个阀门开关执行的线程(该线程启动后一直处于等待状态,WaitforSignal(eventExecute,INFINIT))


谢谢你的好建议,这种方案我也想想看。

目前用onTimer到时可以完成,精度不高,得换多媒体定时器

#14


用OnTimer是肯定不行的,因为WM_TIMER的优先级很低,肯定会出现阻塞,可以采用多媒体时钟定时器循环检测,不会发生阻塞,可以用在工业生产场合,精度为1ms。

#1


顶上去看看

#2


开个线程不停的读就行了,发现状态改变就开关阀门

#3


引用 2 楼 fallingstar08 的回复:
开个线程不停的读就行了,发现状态改变就开关阀门

哦,遇到这种问题,必须还得采用多线程才行吧。一个线程不停的读取,另外一个线程开关阀门。

#4


实时性要求高的场合 建议使用硬件来做,
进程 线程都有会被阻塞的危险

#5


引用 4 楼 zgl7903 的回复:
实时性要求高的场合 建议使用硬件来做,
进程 线程都有会被阻塞的危险


哦,好的,不过目前硬件只能达到这种程度,看样子只有用多线程来做了,应该2个线程就足够了吧

#6


开线程是比较理想的办法!

#7


如果处理数据的过程耗时,再高精度的定时器也没用,多线程也解决不了问题

#8


引用 6 楼 czydxj 的回复:
开线程是比较理想的办法!

行,我打算用多线程来做~我就是一个线程普通的读取,不改变数据。另外一个线程做开关阀门。

#9


引用 7 楼 redui 的回复:
如果处理数据的过程耗时,再高精度的定时器也没用,多线程也解决不了问题


我数据不用处理,一个线程只不停的读取数据。另外一个线程根据读到数据来开关阀门。

#10


你开关阀门的操作耗时长么?
如果时间时间很短可以忽略不计的话感觉就开一个线程就够了。

线程里不断读取数据,读到后马上就去操作,然后返回继续读。

不然2个线程交互可能有点麻烦吧

#11


引用 10 楼 morebread 的回复:
你开关阀门的操作耗时长么?
如果时间时间很短可以忽略不计的话感觉就开一个线程就够了。

线程里不断读取数据,读到后马上就去操作,然后返回继续读。

不然2个线程交互可能有点麻烦吧


谢谢你的建议,我是这样做的,你看看

1.先点按钮,按钮里先发命令(3条命令),很快的,这样就开了3个阀门。

2.在OnTimer里实读取数据
  if(a>2)
  {关掉一个或2个阀门}

3.到达一定的数值后,关闭剩下的阀门

最后这个按钮工作完成。

#12


工控软件一般都用多线程来弄的
我一般专门用一个线程来监测传感器(数字输入)的变化,监测到跳变后,立即触发另外一个阀门开关执行的线程(该线程启动后一直处于等待状态,WaitforSignal(eventExecute,INFINIT))

#13


引用 12 楼 wqhua 的回复:
工控软件一般都用多线程来弄的
我一般专门用一个线程来监测传感器(数字输入)的变化,监测到跳变后,立即触发另外一个阀门开关执行的线程(该线程启动后一直处于等待状态,WaitforSignal(eventExecute,INFINIT))


谢谢你的好建议,这种方案我也想想看。

目前用onTimer到时可以完成,精度不高,得换多媒体定时器

#14


用OnTimer是肯定不行的,因为WM_TIMER的优先级很低,肯定会出现阻塞,可以采用多媒体时钟定时器循环检测,不会发生阻塞,可以用在工业生产场合,精度为1ms。