> 文章列表 > 记录一次使用qt多线程优化运行时间的经验

记录一次使用qt多线程优化运行时间的经验

记录一次使用qt多线程优化运行时间的经验

前两天写代码,有一段运行时间太长,界面明显能感到延迟,这样用户体验感较差,所以要进行优化,缩短运行时间。

首先,通过以下代码,我找到了费时间的主要是程序中的一个算法,这个算法要根据卫星个数循环调用多次;

double time_start = (double)clock();--待计算的代码段--
double time_end = (double)clock();
qDebug() << (time_end - time_start ) / 1000;

接下来我想到两个方式:

  1. 优化算法,使其尽量减少运行时间
  2. 线程计算,每个循环使用一个线程

因为这个算法没办法再进行优化,所以我选择了使用多线程;qt中使用多线程有好几种方式,我选择的是线程池的方式:先自定义类myThread,继承自QObject和QRunnable并重写其Run函数;再将这些线程加入线程池QThreadPool统一管理;

QThreadPool threadpool;
int maxThreadCount = threadpool.maxThreadCount();
threadpool.setMaxThreadCount(maxThreadCount );
for(int i = 0; i < count; i++)   //count为循环次数
{myThread *thread = new myThread;    //线程运行for循环里的算法threadpool.start(thread);
}
threadPool.waitForDone(-1); //等所有线程结束,再继续向下运行(与主线程同步);

运行之后发现运行时间确实减少了,但是也很有限,当循环次数较多时,界面还是会感到延迟,那怎么办?

我急中生智又想到一个办法:Qt中主线程一直在刷新界面,主线程堵塞了,界面才会出现延迟,那我要是再定义一个与主线程异步的子线程执行算法,并将计算结果刷新到界面上,那用户就不会感受到延迟了,最多就是要等待结果刷出来,并不会影响下面的操作;

void myThread1::run()
{//执行算法//刷新界面
}

但是,报错了:Expression:vector iterator not incrementable,说是vector迭代器不可递增,但是我并没有使用vector啊,调试也没有找到原因;

但当我在网上搜索答案时,看到说Qt中只能在主线程(也就是GUI线程)中刷新界面,要是在子线程中刷新的话会有错误发生,所以我就将刷新界面的代码挪到主线程中,运行没有报错,完美!

ps:有哪位大神知道为什么会报错的,可以评论区指教一下;万分感谢!