問題タブ [qfuture]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
multithreading - Qキャンセルして進捗状況を報告できるFuture
クラスには、、QFuture
などのメソッドがあります。これらは、。を介して監視できるようです。ただし、次のドキュメントを参照してください。cancel()
progressValue()
QFutureWatcher
QtConcurrent::run()
QtConcurrent :: run()によって返されるQFutureは、キャンセル、一時停止、または進行状況のレポートをサポートしていないことに注意してください。返されたQFutureは、実行中/終了ステータスと関数の戻り値を照会するためにのみ使用できます。
キャンセルして1回の長時間実行操作の進行状況を報告できる方法を実際に作成できる方法については、無駄に調べました。QFuture
(多分、同様の機能が可能であるように見えQtConcurrent::map()
ますが、私は単一の、長時間実行されるメソッドを持っています。)
(.Netに精通している人のために、BackgroundWorker
クラスのようなもの。)
どのようなオプションが利用できますか?
c++ - Q未来動作しません
プロセスをより効率的にするために、アプリケーションを複数のスレッドで実行しようとしています。Qt の Web サイトで、QFuture
役立つテンプレート クラスを見つけました。私は彼らの例のように使用しようとしています。以下は私のクラス宣言/定義の一部です。
実行しようとすると、(この 1 行から) 次のような 48 個のエラーが発生します。
どこが間違っていますか?別のスレッドでそのスロットを実行するにはどうすればよいですか?
なぜ私はこれが欲しいのですか? このメソッドの実行には最大 30 秒かかる場合があります (一部のデータベース設定がチェックされます)。この間、GUI はフリーズし、ユーザー エクスペリエンスが低下するため、これは良い解決策だと思います。
multithreading - QFutureWatcher の使用時に QtConcurrent::run() で関数が実行されない
QtConcurrent::run()
(Qt for Embedded Linux 4.8)によって呼び出される並列スレッドで、システムからファイルとフォルダーを削除する関数を呼び出したいと考えています。QFuture<bool>
withのみを使用しQFuture::waitForFinished()
て結果を取得し (操作の直後にコードを実行する必要があります)、システムを機能させることができました。
しかし、削除関数内からシグナルとスロットメカニズムを介しQProgressBar
て呼び出された派生クラスで操作の進行中の結果を表示したいのですが、上記の方法で得られるのは、操作が完了していない間にフリーズしたメインスレッドです。setValue(int)
そしてそれは認められません。
そのため、削除操作が完了した後に実行される残りのコードを含む別のスロットに信号を使用QFutureWatcher<bool>
して接続することについて考えました。finished()
私が直面している問題は、これを行うと、削除機能がQtConcurrent::run()
!によって実行されないことです。ターミナルに出力されたメッセージでそれを確認しました。発生するすべてのことは、ファイル削除機能を実行せずにQFutureWatcher
そのシグナルを呼び出すことです(これは、 を使用した場合にも発生します)。finished()
QFutureWatcher::waitForFinished()
これはQtのバグですか?
コードに関しては、Qt Assistant とまったく同じです。QFuture と QFutureWatcher をグローバルに作成し、finished() シグナルをスロットに接続し、 を呼び出してQtConcurrent::run()
、setFuture()
future に接続します。特にない。
どんな助けでも感謝します。
編集
Kuba のリクエストに従って、コードの関連部分を以下に示します。
これは、QFuture と QFutureWatcher を使用したすべてのコードです。は次のremoveFiles
とおりです (QFutureWatcher がなくてもうまく機能することを忘れないでください)。
c++ - QtConcurrent::Run と QThread を使用するにはどうすればよいですか?
私のコードは画像に関するものです。画像を開く、品質を変更する、サイズを変更する、画像サイズを表示することができます...サイズ変更と品質を変更するには、スライダーを使用し、スライダーの値を変更すると、画像がバッファーから何度も読み込まれます。このため、私のプログラムではフリーズが発生しています。だから、私が使いたい問題を解決するためにQtConcurrent::run
and QThread
or QFuture
. 実際、私はそれらをどのように使用できるかわかりません。私の問題を解決するためにあなたの助けを借りたいと思います.
これが私のコードです。凍結を引き起こす機能は次のとおりです。
そして、これは私のmainwindow.hです:
とを自分のコードに統合するQtConcurrent::run()
にはどうすればよいですか?QThread
QFuture
c++ - QFutureWatcher 複数のタスク/フューチャーと finished() シグナルを監視する方法
で始まるいくつかのタスクがありQtConcurrent::run()
ます。タスクにはQFutureWatcher
. 1 つの Future しかQFutureWatcher
監視できないことはわかっていますが、UI から同じタスクを開始した場合、各タスクで QFutureWatcher* を作成するにはどうすればよいでしょうか? それは...ですか :
または、他の何か?
* 問題は、各タスクを自分のコードから開始することですが、タスクは外部 DLL 関数で実行されます。そして、タスクを停止するための API がありません。QFutureWatcher
完了信号を受信した後、タスクが終了するのを待ち、関連するすべてのデータを解放してタスクを閉じることしかできません。
現時点では、2 つの QFutureWatcher を使用します。1 つは最初に実行されたタスクを監視し、もう 1 つは最初のタスクが終了していない場合に開始し、一時ウォッチャーと一時スロットを使用して 2 番目のタスクを監視します (コードは同じです。別のウォッチャーを受け取るためだけに作成します)。最初のタスクが終了するまで、関連するデータを含む信号)。そして、同じコードを監視しましたが、最初のタスクが終了するのを待つために複製する必要があります。これQFutureWatcher
は、終了したシグナルと関連する watcher.result()`s を持つキューがないためです
1) Qt には Queued task メカニズムがありますか? または、どうすれば複数のタスクの先物をキャッチできますか?
2) QtConcurrent::run
cancel() スロットがありません。1 つのシーケンス アイテムで map/mapped 関数を使用できますか? マップされた API には、タスク/終了シグナルのキュー処理がありますか? どうすればそれを理解できますか?どうも!
c++ - QtConcurrent なしで QFuture を使用することは可能ですか?
QThread
ネットワーク クライアントを含む を含むプログラムがあります。クライアントは、オブジェクトを受け取り、処理し、サーバーにアップロードし、応答を取得して、メイン スレッドに報告することになっています。でこれを行いstd::promise
、その を使用しましたfuture
。std::promise
フューチャーを取った後に放出されるオブジェクトのメンバーを作りました。
最小限のサンプル コードは次のとおりです。
私が放出しているオブジェクト:
私が放出に使用している部分:
同じことを行うQtの方法はありますか?
QFuture
QtConcurrent で使用できるクラスしか見つかりませんでした。これを で使用する方法を説明する例が 1 つも見つかりませんでしたQThread
。Qtでこれを正しく行うためのオプションは何ですか?
c++ - GUIスレッドからQFutureを介して並行タスクを送信する
ボタンクリック時の GUI スレッドでの計算を避けるために、別のスレッドで実行しようとしています。
進行状況を監視する機能が必要になるとすぐに、私のコードはこのソースに基づいています。
だから、私のコードは次のとおりです。
これは、qt docs の特定のソースに非常に似ていますが、対応するエラーが発生します。
button_clicked
では、 GUI を作成せずにスロット 内の非 GUI クラスの関数をワーカー スレッドに適切に設定するにはどうすればよいでしょうか。
UPD
さて、今のところコードのコンパイルに成功しました。これがどのように機能するかです。
ただし、ボタンをクリックすると、実行時にエラーが発生します。
実行しようとしている関数はウィジェットを生成しないため、このメッセージの理由は不明です。
すべてのコードが機能すると述べられているいくつかの質問 (このmain()
ような) を読みましたが、それは私のニーズからかけ離れた場所にのみ存在します。では、GUI スレッドから起動するにはどうすればよいでしょうか。