我正在改一个程序,该程序的主要内容有:串口通讯(数据采集),画图,数据显示...我的任务是将原来单线程的改成多线程,希望提高数据采集速度。目前,我已经把数据采集做成一个单独的工作线程,但是由于画图的数据量处理非常大,所以在采集时候,如果进行画图操作的话,还是非常影响采集速度的。
我的问题是:
1.界面线程中过多的数据处理(比如画图)是不是也会影响工作线程的速度。
2.我在线程中的通讯方式采用事件的方式WaitForSingleObject(),这个会影响线程效率吗?与消息的通讯相比如何?或者有什么更好的方法,来实现消息通讯。
3.对于我当前的这个软件,最好的处理办法是什么,是不是将画图也做为一个线程来处理,就能减少画图对数据采集的影响?
我的问题是:
1.界面线程中过多的数据处理(比如画图)是不是也会影响工作线程的速度。
2.我在线程中的通讯方式采用事件的方式WaitForSingleObject(),这个会影响线程效率吗?与消息的通讯相比如何?或者有什么更好的方法,来实现消息通讯。
3.对于我当前的这个软件,最好的处理办法是什么,是不是将画图也做为一个线程来处理,就能减少画图对数据采集的影响?
我正在改一个程序,该程序的主要内容有:串口通讯(数据采集),画图,数据显示... 我的任务是将原来单线程的改成多线程,希望提高数据采集速度。 目前,我已经把数据采集做成一个单独的工作线程,但是由于画图的数据量处理非常大,所以在采集时候,如果进行画图操作的话,还是非常影响采集速度的。
我的问题是:
1.界面线程中过多的数据处理(比如画图)是不是也会影响工作线程的速度。
2.我在线程中的通讯方式采用事件的方式WaitForSingleObject(),这个会影响线程效率吗?与消息的通讯相比如何?或者有什么更好的方法,来实现通讯。
3.对于我当前的这个软件,最好的处理办法是什么,是不是将画图也做为一个线程来处理,就能减少画图对数据采集的影响?
图形显示的内容就是数据采集之后经过计算得到的。画图的动作是用户按按钮执行的,但是如果用户按下按钮后,则要实时更新(斜体字部分其实可以不实现)还有个问题就是:我做了测试,发现,在线程的循环体里做了计数器,发现界面线程(画图)不影响计数,只影响采集到的数据的多少。也就是说,速度的瓶颈(受到界面线程影响的)应该是在事件的同步上,或者在计算上(这部分可能性不大,我认为,计算很简单);
1.画图的处理时间确实是很长的,按下按钮后,估计要十几秒时间,
可是问题是,在工作线程(采集数据)里的计数器并没有受画图影响,也就是说,执行的回合还是一样的。
2.你是说将画图再开一个线程是吧,我也在考虑,主要是画图执行的东西很多,而且响应的地方也不少。再开线程会有点难度,所以也在试。
3.现在就是这么做的,但是这个程序要求是48小时不间断的采集数据(间隔10ms)。
++m_count ; // 接收数据次数
if ( m_count % BASE == 0)
PostMessage(WM_DATA_CHANGED, xxx, xxx); //更新界面
通过修改BASE 大小,决定接收到多少次数据显示一次,改为 1就是每次接收到数据都显示
2. 不好有意思,这点有根据吗?
3. 目前我就似乎这么做的,我工作线程的优先级已经设置最高了。现在我发现是我用的SerialPort这个类中,响应事件的速度有影响。因为我在WriteToPort()设置计数器,也发现美影响。
我觉得这个类,每需要发送一次就setevent,为什么不直接writechar()呢,这样是不是效率会高些。我自己没写过这样的类,不知道想的对不对
http://blog.csdn.net/wujian53
通过测试,我已经知道问题所在了。
1.一个对实时性要求的高的任务,如果想依赖消息或者事件来触发的话,效率是比较低的。
2.CserialPort类如果用于一般串口通讯是没问题的。但是我发现有以下几个不足:
a,往串口写数据的时候以“0x0”结尾(其实这算是一个bug)
b,实时性不是特别高(比如用于我这种情况,就不太合适了)其实这些也算是意料之中的情况,只是一直都没有很好的去研究,测试。
再次谢谢各位。另外我还提了一个问题,希望大家再次帮忙。http://topic.csdn.net/u/20081222/10/b0dc1c05-6445-4754-8ad3-43e7cd2c9687.html
我感觉SerialPort 控件有问题
http://topic.csdn.net/u/20081231/17/b1e674d6-a0b1-445c-936f-65653022d3a3.html
借楼主的地盘一用
谢谢