BCB 串口接收 处理 显示数据,使用多线程速度变慢

laufun 2014-11-21 11:31:44
大家好,我用BCB写的一个程序,串口接收数据,然后处理 ,再用logmemo显示处理;
之前用的单线程的,用timer 每50ms去接收一次数据,然后处理显示,速度很快,不会漏掉数据,但是有时候会造成主界面卡顿,其他操作不能进行;
现在我把处理数据和显示数据部分单独开一个线程,但是发现logMemo显示的时候很多数据丢失漏掉了;

以前单线程的程序结构:
timer() ///50ms
{
接收数据;
if (received 完成一次)
{
直接调用函数, 处理 显示数据;
}
}

我改的多线程程序结构如下,将数据处理和显示单独开一个线程,为了不影响主界面其他操作:
timer() ///50ms
{
接收数据;
if (received 完成一次)
{
threadProcess-> resume ; ///启动处理显示子线程
}
}

thread Execute() //// 处理显示数据子线程
{
while(!Terminaled)
{
数据处理部分

Synchronize(showresult); /// 同步显示

Suspend();
}
}

showresault()
{
....................
}

对多线程不太熟悉,不知道这样写有没有问题,请诸位大神帮忙看下大体的思路是否正确,这样的结构是否会造成速度变慢,感谢
...全文
247 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xjq2003 2014-11-24
  • 打赏
  • 举报
回复
thread Execute() //// 处理显示数据子线程 { while(!Terminaled) { 数据处理部分 Synchronize(showresult); /// 同步显示 Sleep(2); } }
draculamx 2014-11-21
  • 打赏
  • 举报
回复
你居然在工作线程里面去更新界面。。。我也是醉了。。。 应该是在工作线程接收数据,然后在主线程更新界面啊。。。。你把接收数据的工作放到线程里去,然后在timer里面更新界面,或者在线程里面发个消息到主线程,让主线程响应这个消息,然后更新线程 线程一旦开启之后,就让它自己跑,resume (),Suspend();,一般不带这么用的。。。。
我不懂电脑 2014-11-21
  • 打赏
  • 举报
回复
既然用了多线程就不用timer了,在工作线程里处理界面也是可以的。只是看你代码好像线程配合不好。不需要用挂起,继续
laufun 2014-11-21
  • 打赏
  • 举报
回复
引用 3 楼 LinuxCard 的回复:
不是这个搞法,兄弟,多线程不是这么玩的,正确的方法是这样: 线程开一个循环,不断的从串口读取数据,读到的数据,如果需要处理的,比如解包或者处理粘包之类的,然后把数据插入一个共享的list中,然后发个消息给主界面,告诉数据到来,然后主界面取数据,处理。。。 timer什么的,不需要的
谢谢指导哈,我再研究研究
LinuxCard 2014-11-21
  • 打赏
  • 举报
回复
不是这个搞法,兄弟,多线程不是这么玩的,正确的方法是这样: 线程开一个循环,不断的从串口读取数据,读到的数据,如果需要处理的,比如解包或者处理粘包之类的,然后把数据插入一个共享的list中,然后发个消息给主界面,告诉数据到来,然后主界面取数据,处理。。。 timer什么的,不需要的
laufun 2014-11-21
  • 打赏
  • 举报
回复
引用 1 楼 draculamx 的回复:
你居然在工作线程里面去更新界面。。。我也是醉了。。。 应该是在工作线程接收数据,然后在主线程更新界面啊。。。。你把接收数据的工作放到线程里去,然后在timer里面更新界面,或者在线程里面发个消息到主线程,让主线程响应这个消息,然后更新线程 线程一旦开启之后,就让它自己跑,resume (),Suspend();,一般不带这么用的。。。。
引用 1 楼 draculamx 的回复:
你居然在工作线程里面去更新界面。。。我也是醉了。。。 应该是在工作线程接收数据,然后在主线程更新界面啊。。。。你把接收数据的工作放到线程里去,然后在timer里面更新界面,或者在线程里面发个消息到主线程,让主线程响应这个消息,然后更新线程 线程一旦开启之后,就让它自己跑,resume (),Suspend();,一般不带这么用的。。。。
谢谢 draculamx 指点,新手刚学习多线程,不太会用 生搬硬套用的。 showresult( ) 主要是将线程处理后的字符显示到 主界面 logMemo里面,我看到很多 多线程的例子 Synchronize、 resume ()、Suspend() 都是这样用的啊, Synchronize(showresult)放到 线程 Execute( ) 函数里面。 Synchronize(showresult)可以把它放到主线程里面吗? 另外让线程跑起来是 用 while 循环一直让它跑吗? 因为接收数据是50ms更新一次,要让线程处理显示程序和它同步才行,这个不用resume () Suspend()不知道怎么处理呢?

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧