你是不是用死循环来检测数据和分析数据呀。那很费CPU时间的

解决方案 »

  1.   

    不会,在多线程当中反而可以提高效率,你在用线程检测的时候不要使用同步方式,应该使用异步方式,一个线程用来检查串口数据,在检测的时候使用WaitForSingleObject函数进行触发,当串口数据到达的时候,就进行读取,然后在读取之后再发送消息或者触发事件给分析输入的数据,这样效率就高了。
      

  2.   

    like as zzh(),使用异步方式和事件触发方式。
      

  3.   

    我是用死循环来检测数据的
    因为我使用的是一块控制卡,读取的是控制卡所带的串口缓冲区中的数据,好象没有类似WaitForSingleObject函数的函数接口
    我的线程是工作者线程,能接收消息吗?
      

  4.   

    采用OVERLAPPED IO 方式。
    MSDN中有详细说明,多看看,最好用最新的MSDN。
      

  5.   

    你可以向你的工作者线程发消息。postthreadmessage()
      

  6.   

    最好,在用线程检测的时候不要使用同步方式,应该使用异步方式,一个线程用来检查串口数据,在检测的时候使用WaitForSingleObject函数进行触发,当串口数据到达的时候,就进行读取,然后在读取之后再发送消息或者触发事件给分析输入的数据,这样效率就高了。 
    但在现在一般的机器上应该也不会有问题,可能是算法有点问题。 
    好好检查一下吧。
      

  7.   

    要不要偶说一句?怕被各位打死
        因为我建议使用同步方式。为什么呢?FT,多线程还异步,多此一举么。使用Wait函数等待,实际上也就是同步方式啊。异步方式的用处在于线程不必等待而可以处理其他事情,它现在没什么可处理的,为什么要异步呢?死循环是同步方是最基本的结构。不过你要考虑一下退出的问题。如果不方便,可以使用“假同步”,也就是用Wait函数实现同步运行。注意哦,本质上还是同步的。
        效率不高的问题很正常。大家可能没有经验,我当年可是做过这个问题。问题的核心在于Windows是分时系统,线程调度不可能满足很高的实时要求。其他线程会随机干扰你的工作,调高优先级也没用,弄不好系统会死掉。另外执行效率也不高,几个API调用就要几个毫秒,稍微快一点的采样都不行。这些问题从软件编码很难解决,有条件的话你应当考虑上下位机的结构。
        建议你读一读《Windows NT技术内幕》,对这个问题会有更深了解。
      

  8.   

    EagleCK() 
    那你的意思是说我现在在单机的环境中只能这样了吗?
    有没有更好的解决方法?
      

  9.   

    我不清楚你的采样频率有多高,这个参数是设计时首先要考虑的。
    比如我当年调过的程序,采样旋转机构数据,每转采至少6次,每秒50转以上。这就比较有问题,采样频率超过了300Hz,周期小于4ms。测一下Windows函数调用就知道,几个调用就可能用掉几个毫秒,所以满足要求很困难。最后是用了缓存。但是如果实时要求高就不好办。
    如果想维持目前的结构,一个办法是间歇采样,在采样期间使用实时级优先级,这样系统会短暂失去反应,所以采样时间不能长,编程一定要小心。这个办法比较野蛮,也不能根本解决。