2012-02-20 25 views
2

私のアプリケーションでは、私は、ダイアログに次のコードを持っている: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だろう(いくつかの読み取りを行うと、QFutureQFutureWatcherサポートが進行値を監視しているのを見ました。 orkはこの状況で素晴らしいです!)、それらはQtConcurrent::runと一緒に使用することはできません。

エミッタスレッドで呼び出された関数の進行状況を監視できるように、別のスレッドで移動した信号をメインスレッドのスロットに接続するにはどうすればよいですか?

* 編集 - *実際に私のコードでエラーが見つかりましたが、影響はありません。私は

connect(drive, SIGNAL(FileProgressChanged(Progress)), this, SLOT(OnFileProgressChanged(Progress))); 
+0

私は本当に理解していない、一見すると、これはうまくいくようです。スレッドは 'Drive'から' FileProgressChanged'を出します - 'OnFileProgressChanged'が正しく呼び出されていますか?あるスレッドから別のスレッドのスロットに信号を送信すると、正常に動作するはずです(キューに入れられます)。 –

+0

この関数では、コードは 'Emit FileProgressChanged(p)'です。私がそれに入ると、それは[this](http://pastebin.com/hhSa8WjV)に私を連れてきますが、OnFileProgressChangedの私のブレークポイントは決して打撃を受けません。 – Lander

答えて

1

のように、QueuedConnectionconnect()を使用してみてください信号の後に引数としてthisを追加するのを忘れ:

エミッタと受信機を別々にしているので、接続はすでに(デフォルトではキューに登録する必要があります
connect(drive, SIGNAL(FileProgressChanged(Progress)), this, SLOT(OnFileProgressChanged(Progress)), Qt::QueuedConnection); 

スレッド)を使用していますが、これにより明示的になります。

EDIT:ProgressタイプがQtのメタオブジェクトシステムに登録されていないという問題がありました。 qRegisterMetaType<Progress>("Progress");を追加すると問題が解決しました。

+0

ダイスはありません。私はいくつかのより多くの検索を行い、私は*答えが[この質問にある]と信じて*(http://stackoverflow.com/questions/7881052/qt-qthread-trouble-using-signal-slot-going-from-worker- to-gui)。信号/スロット接続は、パラメータなしで正常に動作します。 – Lander

+1

これも可能です。あなたは 'qRegisterMetaType (" Progress ");' 'connect()'の前のどこかの行にする必要があります。ただし、コンパイル時または実行時のどちらでもエラーをスローする必要があります。 –

+0

テストしたところ問題でした!非常に簡単な修正、ありがたいことに。助けてくれてありがとう。 – Lander

0

問題はクロススレッド信号/スロットではなく、パラメータProgressであるように見えます。 This質問の答えは、さらに詳細に入るが、溶液は進歩が宣言されたヘッダファイルに次のようにして発見された:

struct Progress 
{ 
    int Current; 
    int Maximium; 
    std::string FilePath; 
    std::string FolderPath; 
    int TotalMinimum; 
    int TotalMaximum; 
}; 

Q_DECLARE_METATYPE(Progress) 

そして、私のフォームクラスで:

qRegisterMetaType<Progress>(); 
    connect(Drive, SIGNAL(FileProgressChanged(const Progress&)), this, SLOT(OnFileProgressChanged(const Progress&)), Qt::QueuedConnection); 

Progressに変更しますconst Progress&はおそらく必要ありませんが、私はテスト中にそれを残しました。

関連する問題