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