先说结论:QtConcurrent::run启动的耗时处理函数,不允许处理ui界面对象,如控件,如进度条等等!
QtConcurrent::run非常好用,胜过QThead的两种方式(run和moveToThread),例如下面是非常直观和简单的使用方式:
QT += concurrent
#include <QtConcurrent>
#include <QThread>
void MainWindow::doSomeWork()//死循环操作,代替原有代码的函数功能
{
int i=0;
while(myEnable)
{
i++;
qDebug()<<i;
QThread::msleep(10);
}
}
void MainWindow::myStart()//启动函数是需要在原有代码基础上增加
{
myEnable=1;
QtConcurrent::run(this,&MainWindow::doSomeWork);//多线程执行死循环启动,可以带参数
void MainWindow::myExit()
{
myEnable=0;//
}
但是,但是,上述的MainWindow::doSomeWork函数中不能访问ui对象,会引起程序崩溃!!原因后面解释。先说解决办法:
一种方法是,MainWindow::doSomeWork能读写简单类型的数值变量,int,float类型,则可以借助这些简单类型变量做个过渡中转一下。既然是ui界面对象,是给人看的,延时几十个ms,人的眼睛不会有感觉,因此,开一个定时器,轮询这些简单的数值int、float变量,在定时器里去更新ui界面对象,这是最简单的方法;
另一种方法是,在调用QtConcurrent::run(this,&MainWindow::doSomeWork)的地方,检查返回值,开一个循环等待完成。在循环里完成对界面ui的操作,如下面在按钮点击事件中:

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



