2017-03-31 6 views
-1

私は重い作業をしています。私はそのプログラムを表示するためのQProgressBarを作成し、C++のstd :: threadクラスを使って他のスレッドで重いタスクを実行しました。しかし、QProgressBarは動作しません.QProgressBarを持つウィンドウだけが起動します。ここ はコードです:ここではQProgressBarと重い作業

QProgressBar progress; 
progress.setRange(0, 0); 
progress.show(); 
if (keyLength == 1024) 
    std::thread(&RSA::generateKeys, &rsa, RSA::RSA_1024).join(); 
else if (keyLength == 2048) 
    std::thread(&RSA::generateKeys, &rsa, RSA::RSA_2048).join(); 

は結果である: enter image description here

+2

そして、どこにコードがありますか?それはステータスが変更されたことをプログレスバーに伝えますか?なぜ、有効な最小値/最大値を設定するのではなく、現在の値が変更されたときにいつでも進行状況バーを未定義状態に設定していますか? –

+0

これは最小値と最大値なしで実行して実行する必要があります。このようにhttp://doc.qt.io/qt-5/images/macintosh-progressbar.png – van9petryk

+1

これを行うとしますか?更新された状態で何らかの信号がなくても、正しい時間内にプログレスバーの長さの0〜100%をどのように実行する必要がありますか? –

答えて

0

これは、物事が行われている方法ではありません。 :) Here私は、Workerパターン(重いタスクを処理し、UIにレポートを戻す別のスレッド)を使用した例を見ることができます。ここに私のアプリケーションがどのように見えるかです:

enter image description here

私はQThread(処理を扱うオブジェクトを含むワーカースレッド)を使用し、私は同じことを行うためにあなたをお勧めすることができます。 QThreadをサブクラス化し、本当に必要なものに応じてrun()メソッドをオーバーライドすることもできますが、これはほとんどありません。

PS:別の方法として、QRunnableを使用することができます(毎回別々のスレッドを管理する必要はありません)。 QRunnableの問題点は、QObjectというサブクラスではないことです。つまり、スロット信号メカニズムを使用してUIに報告することはできません。もちろん、それを変更することはできますが、それは非常に軽量なソリューションを意図した実行可能ファイルの目的を破ります。

+0

私はこのタスクになぜC++スレッドを使用できないのか分かりません。私は報告したくない、私が何回行ったタスク、私はユーザーに報告したい、そのタスクはまだ解決している。 – van9petryk

+0

私はあなたが進捗バーが(別のスレッドで)どのくらい離れてタスクが完了したかを報告することを理解していますか? UIに戻って報告するには、シグナルを使用する必要があり、そのためには 'QThread'が必要です。 – rbaleksandar

+0

@rbaleksandar 'QThread'はスレッドハンドルです。ファイルハンドルクラスを変更しないのと同じように、 'QThread'をそれから派生させて変更するべきではありません。シグナルを必要とする場合は、 'QObject'から派生するか、シグナルを放棄して、受信者に直接呼び出すことを待ちます。[GCD-style](http://stackoverflow.com/a/21653558/1329652)任意のスレッドからシグナルを発信したり、スロット呼び出しを待ち行列に入れることができます。 'QThread'はこの点で特別なものではありません。 –

関連する問題