私のアプリケーションでは、私は、ダイアログに次のコードを持っている:QtConcurrentを使用して別のスレッド上のシグナル/スロットを接続する::実行
connect(drive, SIGNAL(FileProgressChanged(Progress)), SLOT(OnFileProgressChanged(Progress)));
QtConcurrent::run(this, &ProgressDialog::PerformOperation, Operation, *Path, OutPath, drive);
PerformOperation機能は、最終的には、信号FileProgressChanged
を発するdrive
内の関数の呼び出し以下のように、私のOnFileProgressChanged
機能は次のとおりです。
void ProgressDialog::OnFileProgressChanged(Progress p)
{
if (ui->progressCurrent->maximum() != p.Maximium)
ui->progressCurrent->setMaximum(p.Maximium);
ui->progressCurrent->setValue(p.Current);
if (ui->groupBoxCurrent->title().toStdString() != p.FilePath)
ui->groupBoxCurrent->setTitle(QString::fromStdString(p.FilePath));
}
私はどのWだろう(いくつかの読み取りを行うと、QFutureとQFutureWatcherサポートが進行値を監視しているのを見ました。 orkはこの状況で素晴らしいです!)、それらはQtConcurrent::run
と一緒に使用することはできません。
エミッタスレッドで呼び出された関数の進行状況を監視できるように、別のスレッドで移動した信号をメインスレッドのスロットに接続するにはどうすればよいですか?
* 編集 - *実際に私のコードでエラーが見つかりましたが、影響はありません。私は
connect(drive, SIGNAL(FileProgressChanged(Progress)), this, SLOT(OnFileProgressChanged(Progress)));
私は本当に理解していない、一見すると、これはうまくいくようです。スレッドは 'Drive'から' FileProgressChanged'を出します - 'OnFileProgressChanged'が正しく呼び出されていますか?あるスレッドから別のスレッドのスロットに信号を送信すると、正常に動作するはずです(キューに入れられます)。 –
この関数では、コードは 'Emit FileProgressChanged(p)'です。私がそれに入ると、それは[this](http://pastebin.com/hhSa8WjV)に私を連れてきますが、OnFileProgressChangedの私のブレークポイントは決して打撃を受けません。 – Lander