0

私には重い仕事があります。そのプログラムがまだ機能していることを表示するために QProgressBar を作成し、c++ std::thread クラスを使用して別のスレッドで重いタスクを実行しました。しかし、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();

結果は次のとおりです。 ここに画像の説明を入力

4

1 に答える 1

1

これは物事が行われる方法ではありません。:)ここで、私が作成した Worker パターン (いくつかの重いタスクを処理し、UI に報告する別のスレッド) を使用する例を見ることができます。これが私のアプリケーションの外観です。

ここに画像の説明を入力

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

PS: 代わりに使用できますQRunnable(別のスレッドを常に管理する必要がない、時々実行されるタスクに非常に役立ちます)。問題QRunnableは、サブクラス化QObjectされないことです。つまり、スロット シグナル メカニズムを使用して UI に報告することはできません。もちろん、それを変更することはできますが、非常に軽量なソリューションを意図したランナブルの目的に反します。

于 2017-03-31T20:48:24.060 に答える