这就是我所拥有的:
void MyThread::run() {
int progress = 0;
while (1) {
// do something
progres++;
emit(progressChanged(progress));
}
}
// mainwindow
auto t = new MyTread();
connect(t, SIGNAL(progressChanged(int)), this, SLOT(onProgressChanged(int)));
t->start();
void MaiWindow::onProgressChanged(int) {
this->progressBar->setValue(progressBar->value() + 1);
}
它可以正常工作,线程中的工作已完成,进度条一直上升到100%。
但是,UI完全冻结/缓慢。拖动带有进度栏的窗口会导致5秒钟的延迟。我尝试使用较低的线程优先级-没有结果。
也许我这里需要互斥锁?
最佳答案
不要发出太多的progressChanged信号。信号速度很快,但是如果您每秒设置数百或数千次进度条值,则UI会冻结。保持进度栏更改为最小,每秒5-10次更改已足够。