我正在改一个程序,该程序的主要内容有:串口通讯(数据采集),画图,数据显示...我的任务是将原来单线程的改成多线程,希望提高数据采集速度。目前,我已经把数据采集做成一个单独的工作线程,但是由于画图的数据量处理非常大,所以在采集时候,如果进行画图操作的话,还是非常影响采集速度的。
我的问题是:
1.界面线程中过多的数据处理(比如画图)是不是也会影响工作线程的速度。
2.我在线程中的通讯方式采用事件的方式WaitForSingleObject(),这个会影响线程效率吗?与消息的通讯相比如何?或者有什么更好的方法,来实现消息通讯。
3.对于我当前的这个软件,最好的处理办法是什么,是不是将画图也做为一个线程来处理,就能减少画图对数据采集的影响?
    
    

解决方案 »

  1.   

    修改一下,有表述不当的地方:
    我正在改一个程序,该程序的主要内容有:串口通讯(数据采集),画图,数据显示... 我的任务是将原来单线程的改成多线程,希望提高数据采集速度。 目前,我已经把数据采集做成一个单独的工作线程,但是由于画图的数据量处理非常大,所以在采集时候,如果进行画图操作的话,还是非常影响采集速度的。 
    我的问题是: 
    1.界面线程中过多的数据处理(比如画图)是不是也会影响工作线程的速度。 
    2.我在线程中的通讯方式采用事件的方式WaitForSingleObject(),这个会影响线程效率吗?与消息的通讯相比如何?或者有什么更好的方法,来实现通讯。 
    3.对于我当前的这个软件,最好的处理办法是什么,是不是将画图也做为一个线程来处理,就能减少画图对数据采集的影响? 
      

  2.   

    to Jacklzw88,当然是保证数据采集!
    图形显示的内容就是数据采集之后经过计算得到的。画图的动作是用户按按钮执行的,但是如果用户按下按钮后,则要实时更新(斜体字部分其实可以不实现)还有个问题就是:我做了测试,发现,在线程的循环体里做了计数器,发现界面线程(画图)不影响计数,只影响采集到的数据的多少。也就是说,速度的瓶颈(受到界面线程影响的)应该是在事件的同步上,或者在计算上(这部分可能性不大,我认为,计算很简单);
      

  3.   

    To mxw0922,
    1.画图的处理时间确实是很长的,按下按钮后,估计要十几秒时间,
    可是问题是,在工作线程(采集数据)里的计数器并没有受画图影响,也就是说,执行的回合还是一样的。
    2.你是说将画图再开一个线程是吧,我也在考虑,主要是画图执行的东西很多,而且响应的地方也不少。再开线程会有点难度,所以也在试。
    3.现在就是这么做的,但是这个程序要求是48小时不间断的采集数据(间隔10ms)。
      

  4.   

    显然要保证数据采集,数据显示只是给人看的,人眼有停顿,数据没有最简单的做法是:在采集线程中:#define  BASE   3getdata()   // 获取数据
    ++m_count ; // 接收数据次数
    if ( m_count % BASE    == 0)
      PostMessage(WM_DATA_CHANGED, xxx, xxx);   //更新界面
    通过修改BASE   大小,决定接收到多少次数据显示一次,改为 1就是每次接收到数据都显示
      

  5.   

    To cnzdgs:首先谢谢你的回答1. 事实似乎证明这点是对的。 
    2. 不好有意思,这点有根据吗?
    3. 目前我就似乎这么做的,我工作线程的优先级已经设置最高了。现在我发现是我用的SerialPort这个类中,响应事件的速度有影响。因为我在WriteToPort()设置计数器,也发现美影响。
      

  6.   

    还有,有人用过CserialPort吗,大家觉得这个类的效率如何?
    我觉得这个类,每需要发送一次就setevent,为什么不直接writechar()呢,这样是不是效率会高些。我自己没写过这样的类,不知道想的对不对
      

  7.   

    3.是不是应该考虑如何优化一下画图,让它performance提高点
      

  8.   

    我目前也在做类似的程序 遇到的问题是10ms内要完成的任务太多 特别是显示和保存数据(写硬盘)。 楼主有兴趣讨论具体细节请加QQ398371604
      

  9.   

    CnComm 是一个基于消息的串口封装类,楼主可以看一下:
    http://blog.csdn.net/wujian53
      

  10.   

    多谢各位回答。
    通过测试,我已经知道问题所在了。
    1.一个对实时性要求的高的任务,如果想依赖消息或者事件来触发的话,效率是比较低的。
    2.CserialPort类如果用于一般串口通讯是没问题的。但是我发现有以下几个不足:
          
          a,往串口写数据的时候以“0x0”结尾(其实这算是一个bug)
          b,实时性不是特别高(比如用于我这种情况,就不太合适了)其实这些也算是意料之中的情况,只是一直都没有很好的去研究,测试。
    再次谢谢各位。另外我还提了一个问题,希望大家再次帮忙。http://topic.csdn.net/u/20081222/10/b0dc1c05-6445-4754-8ad3-43e7cd2c9687.html
      

  11.   

    谁可以帮忙回答这个问题呀 
    我感觉SerialPort 控件有问题
    http://topic.csdn.net/u/20081231/17/b1e674d6-a0b1-445c-936f-65653022d3a3.html 
    借楼主的地盘一用
    谢谢