如何分别响应不断发来的信号?用多线程?Up者有分。(100分)

  • 主题发起人 主题发起人 lixx
  • 开始时间 开始时间
L

lixx

Unregistered / Unconfirmed
GUEST, unregistred user!

我有一个程序要不断采集信号,然后检测每个信号是否超过某个范围,
如果超过就延时1秒再作相应处理。这些超标信号来的时间来数量密集程序都是随机的。
我该怎么办?
 
我目前的做法是:
另开一个线程延时1秒,然后作处理(对这些超标信号的处理都是一样的)。
可以这样做有个问题:
如果在这延时的1秒的时间内来了信号,我没法办,只能漏掉。
不知哪位有好办法?
 
那我再细说一遍:
我在主线程内从采集卡中采集数据(速率为10K HZ),然后对每个采集来的数据进行判断:
看它是不是超过了某个范围,如果是就把延时1秒,然后把该信号输出去(通过I/O板)。
我目前的做法是:
另开一个线程延时1秒,然后作处理(对这些超标信号的处理都是一样的)。
可以这样做有个问题:
如果在这延时的1秒的时间内来了信号,我没法办,只能漏掉。
这样明白了吗?
 
直接用软件处理恐怕做不到吧?假如有个什么其它的东东占用CPU100%,你能程序能行吗?
就算占不到100%,你的定时器可以做到10K HZ吗? 用高精度定时器的话,也会因为系统
资源的占用情况而受到影响吗?
如果由硬件(如单片机)来做采集工作,应该完全胜任,然后由它来将一段时间的采集值
发送给你。
可能和你的要求不同,请见谅,虽然你说了两遍,还是说的不太清楚。
 
目前我就是用的高精度定时器,所以系统资源被占用的很厉害。
我这样想过,还没有实现:
我想我每采集一个超标的信号,就开一个线程,在这个线程中做延时工作,延时完了之后,
就结束线程。可是由于信号来的时间与密集程序都是随机的,所以我不敢想像这样行不行?
 
这不是很简单的事吗?
用一个线程接收数据。
如果需要处理,将。。。放入一个队列
另一个线程处理队列中的相应处理过程。
注意使用信号量进行线程的同步。
 
同意远帆
一个线程接收数据
如果超过了某个范围,放入一个队列
另一个线程看队列中是否有数据,有就延时,从队列中取数据处理
再就是队列的操作同步的问题了,这个简单
 
>远帆
>liuxi
这样做的问题在于:这样改变了原来信号的时序。
比如说一连有三个信号超标,其中第一个与第二个相差700毫秒,而第二个与第三个相差2秒
如果有上面的方法延时的话,那延时后的这三个信号的间隔肯定已经变了。
如下图:
超标信号
| | |
延时处理应当的结果是:
              | | |
 
不会改变时序。
你在队列中加上接收时间字段。
处理线程是循环处理的,一但发现延时1秒,就立即执行。
当然要求你的处理是短时间内可以完成的。
这样不会改变时序。
 
那这个线程是可重入的吗???
 
时间间隔不可能完全准确地,但是次序不会变的
你可以在队列的数据中添加时间信息,尽量努力啦
 
添加时间信息??
怎么添加??
可否详细说说?
 
关注中。。。
 
注意:我说的时序不仅仅是信号的先后次序问题,而且还包括信号之间的间隔!
如果在一个线程中处理的话,我一直没想到好办法。
 
在每次触发时利用GetTicket(?)得到当前时间信息,
在队列中加入信息时在记录中根据需要添加相应的时间信息
比如当前的时间信息,和上次触发之间的间隔
如果你的处理过程足够的短,比如PostMessage,那么Do it 然后判断是否有下一个事件
,没有的话就WaitForSingleObject等待通知,有的话,取得时间间隔,Sleep相应的时间
,然后Do it
如果处理时间可能会影响..那么可以建一个线程池,在一个线程中就不太可能了
时间间隔不可能绝对精确的
试想系统唤醒一个线程也是需要时间的
真的要求精确的话,应该用单片机
 
如果处理时间足够短(需要处理第二条之前可以处理完成),那么一个线程足已,否则你的
硬件达不到要求,需要更换。
 
每来一个信号就开一个线程,学习FlashGet,他开了多少线程,并不占用很大的系统资源
 
>爱元元的哥哥
我前面说过,我也想过这样做,可是我不能保证系统的稳定性。
我后来算了算,如果这样做同时最多可能有几十个至少十几个线程。
我看FlashGet线程数还没达到这个数量。
另外线程池如何用,我还没有用过,不知那位能告诉我一声?
 
这些要靠自己去领会的,多看看一些WINDOWS编程书,不要局限在
DELPHI下,
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部