• 3318阅读
  • 5回复

[提问]多线程数据处理 [复制链接]

上一主题 下一主题
离线我很好
 

只看楼主 倒序阅读 楼主  发表于: 2018-01-29
回复本帖可获得1RMB金钱奖励!
每人最多可获奖1次,奖池剩余3RMB金钱 (中奖几率10%)
功能描述:界面绘制曲线,需要调用底层算法拟合计算得到的数据,界面上有开始按钮和结束按钮,按开始后底层算法接收输入参数开始做拟合,把每一次拟合的结果显示到界面中,当用户觉得达到预期拟合效果时可手动停止
问题拟合过程很耗时,如何在不改变底层算法的情况下,实现把耗时的拟合过程放到另一个线程上去,保证可以向主界面传输数据,并可以手动停止

离线rjsloth

只看该作者 1楼 发表于: 2018-01-30
1,封装一个类x,类中包含各种拟合算法,给该类一些signals,用于把拟合的结果传出去。
2,封装一个类y,类中包含对拟合结果的响应(绘图等)slots。
3,在主线程中定义一个类y的对象。
2,继承QThread,重写一个多线程类,在该类的run函数中定义一个类x的对象,并将该对象中的signals绑定到主线程中y对象的对应slots。在run函数的最后调用函数exec(这是关键所在)。
生命不止,探索不休…
离线我很好

只看该作者 2楼 发表于: 2018-01-30
回 rjsloth 的帖子
rjsloth:1,封装一个类x,类中包含各种拟合算法,给该类一些signals,用于把拟合的结果传出去。
2,封装一个类y,类中包含对拟合结果的响应(绘图等)slots。
3,在主线程中定义一个类y的对象。
2,继承QThread,重写一个多线程类,在该类的run函数中定义一个类x的对象,并将该对象中的sig .. (2018-01-30 11:30) 

谢谢你的回答,可是手动停止如何实现呢,在run函数的最后调用函数exec(这是关键所在)这是为什么呢,线程新手表示不懂啊,望不吝赐教
离线hc976865965

只看该作者 3楼 发表于: 2018-01-31
回 我很好 的帖子
我很好:谢谢你的回答,可是手动停止如何实现呢,在run函数的最后调用函数exec(这是关键所在)这是为什么呢,线程新手表示不懂啊,望不吝赐教 (2018-01-30 21:22) 

手动停止,你只需要把你的子线程stop就可以了啊,如果完全不用的话,还要释放资源
离线cangyuegui

只看该作者 4楼 发表于: 2018-02-26
回 hc976865965 的帖子
hc976865965:手动停止,你只需要把你的子线程stop就可以了啊,如果完全不用的话,还要释放资源 (2018-01-31 12:53) 

不行的
如果没有随时检查flag的机制,一个loop未执行完成根本停不下来吧。
离线rjsloth

只看该作者 5楼 发表于: 2018-03-29
回 我很好 的帖子
我很好:谢谢你的回答,可是手动停止如何实现呢,在run函数的最后调用函数exec(这是关键所在)这是为什么呢,线程新手表示不懂啊,望不吝赐教 (2018-01-30 21:22) 

在run函数的最后调用函数exec,表示该子线程是有自己的事件循环的(Qt中线程的用法主要有两种,一种是写成类似于死循环你的方式,可以重复执行一段代码;一种就是最后调用exec进入事件循环),这种情况下,这个子线程中的“所有继承自QObject的类的对象”(如何成为线程中的对象,一种是在run函数中定义,或者通过移动到指定线程的方式),都可以接收事件、都能够支持signal和slot的机制。

其实qapplication也有exec函数的,如果一个程序是有qapplication的,最后也都会调用qapplication的exec。

这时候,可以把主线程想象成一个人,子线程是另一个人,他们各做各的事情,他们之间可以通过信号槽或者事件来交互信息。数据计算在子线程中进行,显示界面必须在主线程中进行。

另外建议你一定要了解一下信号和槽的连接方式,在多线程的情况下这个必须了解,不然容易出错。
生命不止,探索不休…
快速回复
限100 字节
 
上一个 下一个