1.在一线程中接收串口数据(这个线程是用来接收一包数据的),线程优先级为15,线程超时为2秒.正常使用没问题!,但如果,不停的最小化程序,再还原程序,再最小化......(有点变态,就是想在这种极端的情况下测试)或不停打开象WORD这类的程序时,接收程序就会超时接不上来数据(我有重发及缓存机制,数据不会丢,不过会使下位机不停重发),给我的感觉是这样极端的操作时,串口接收线程就得不到时间片运行,所以就会超时.请问是不是这个原因.有没有最好的解决方法!2.在另一个线程中,处理串口接收来的数据(数据包被放在一个缓存队列中),这个线程是个while(1)循环,不停查询队列,队列中有数据就处理!这让处理在win2000以上的系统中没问题,可在98中就会使同级的串口线程超时(现处理的方法是在循环中加入sleep(100)挂起线程一会).给我的感觉是这个线程老占用CPU时间,串口接收线程就得不到时间片运行,请问为什么98和2000以上的系统有这样的差别,为什么,有没有除sleep以外更好的解决方法!

解决方案 »

  1.   


    1、你说的原因是正确的。解决问题的办法就是延时稍微长一点。好像没有特别的解决办法。
    2、while(1)里面肯定需要用sleep进行线程调度切换的,2000里面可能做了内核处理,如果不sleep的话,其他的线程得不到cpu机会跑的。建议你不要使用这种轮巡的方式查询数据,建议使用信号量来激活,也就是说处理串口接收的数据的线程一直waitforsingleobject挂起等待事件通知,接收线程接收到数据后再通过事件进行通知。这样处理比较合理,不会浪费cpu的处理时间。
      

  2.   

    谢谢sanhill():兄弟!串口接收数据的线程我用的是事件方式它不太占CPU,查询队列中数据的线程我用的是while(1)就它占CPU,我现在用Sleep,还有没有所的更好的方法处理这种情况!
        各位兄弟继续!!!!!!!!!!!!!!!!!!!!!!!!!!
      

  3.   

    超时就用默认的超时,结合WaitCommEvent/Overlap IO。
    好像不用弄那么高的优先级,也不用什么Sleep吧。
    www.codeproject.com上有许多这方面的例子,楼主不妨一读。
      

  4.   

    DentistryDoctor(My heart will fly,in the sky.) ( )兄弟:请试试我给出的极端的情况下的串口接收情况!请注意!Sleep不是用在串口接收线程中的,串口线程我就是用的WaitCommEvent/Overlap IO ,我是在串口接收线程中,将收来的数据写入到一个队列中,在别一个线程中用while(1)来查询队列,并取出数据,再处理.问题是在极端情况下(请看上面),串口接收数据的线程在指定的时间内会接不完数据.
       而在98下(2000以上不会),处理数据的线程中由于使用了while(1)也会导致,串口接收线程超时!我想知道原因!!!!!!!!!!!
      

  5.   

    2.在另一个线程中,处理串口接收来的数据(数据包被放在一个缓存队列中),这个线程是个while(1)循环,不停查询队列,队列中有数据就处理!这让处理在win2000以上的系统中没问题,可在98中就会使同级的串口线程超时(现处理的方法是在循环中加入sleep(100)挂起线程一会).给我的感觉是这个线程老占用CPU时间,串口接收线程就得不到时间片运行,请问为什么98和2000以上的系统有这样的差别,为什么,有没有除sleep以外更好的解决方法!---------------------------------
    很简单:
    这个线程查询队列是否有数据:
    1,有数据,循环处理,直到数据处理完。
    2。无数据,则挂起这个线程,等待串口接收线程唤醒。(WaitForSingleObject)
    串口接收线程:
    1、串口有数据来,队列不空,则数据放队列。
    2、串口有数据来,队列空,数据放队列,再唤醒上面的线程(使用SetEvent)
      

  6.   

    用事件同步,数据从串口缓冲区读出--》setevent
    另一个线程waitforsingleobject或者waitformultipleobjects等待次事件
      

  7.   

    同意:test2002(test2002) ( )兄弟的见解,我试试去!还有没有更好的,继续!!!!!!!