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%まで上がります。

しかし、UIは完全にフリーズ/ラグしています。プログレスバーのあるウィンドウをドラッグすると、5秒の遅延が発生します。低いスレッド優先度を使用してみましたが、結果はありません。

たぶん私はここにミューテックスが必要ですか?

4

1 に答える 1

3

あまり多くのprogressChangedシグナルを出力しないでください。信号は高速ですが、プログレスバーの値を1秒間に数百回または数千回設定すると、UIがフリーズします。プログレスバーの変更を最小限に抑えます。1秒あたり5〜10回の変更で十分です。

于 2012-06-14T21:27:22.703 に答える