这就是我所拥有的:

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次更改已足够。

10-04 20:11