查看完整版本: [-- 多线程数据处理 --]

QTCN开发网 -> Qt基础编程 -> 多线程数据处理 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

我很好 2018-01-29 21:39

多线程数据处理

功能描述:在界面绘制曲线,需要调用底层算法拟合计算得到的数据,界面上有开始按钮和结束按钮,按开始后底层算法接收输入参数开始做拟合,把每一次拟合的结果显示到界面中,当用户觉得达到预期拟合效果时可手动停止
问题:拟合过程很耗时,如何在不改变底层算法的情况下,实现把耗时的拟合过程放到另一个线程上去,保证可以向主界面传输数据,并可以手动停止


rjsloth 2018-01-30 11:30
1,封装一个类x,类中包含各种拟合算法,给该类一些signals,用于把拟合的结果传出去。
2,封装一个类y,类中包含对拟合结果的响应(绘图等)slots。
3,在主线程中定义一个类y的对象。
2,继承QThread,重写一个多线程类,在该类的run函数中定义一个类x的对象,并将该对象中的signals绑定到主线程中y对象的对应slots。在run函数的最后调用函数exec(这是关键所在)。

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

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

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

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

cangyuegui 2018-02-26 09:04
hc976865965:手动停止,你只需要把你的子线程stop就可以了啊,如果完全不用的话,还要释放资源 (2018-01-31 12:53) 

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

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

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

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

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

另外建议你一定要了解一下信号和槽的连接方式,在多线程的情况下这个必须了解,不然容易出错。


查看完整版本: [-- 多线程数据处理 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled