0

这就是我所拥有的:

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%。

但是用户界面完全冻结/滞后。拖动带有进度条的窗口会导致 5 秒延迟。我尝试使用较低的线程优先级 - 没有结果。

也许我在这里需要一个互斥锁?

4

1 回答 1

3

不要发出太多 progressChanged 信号。信号很快,但如果您每秒设置数百或数千次进度条值,则 UI 将冻结。将进度条更改保持在最低限度,每秒 5-10 次更改就足够了。

于 2012-06-14T21:27:22.703 回答