問題タブ [qtconcurrent]
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.
c++ - プログラムの CPU 使用率を下げるには?
私は、多くの浮動小数点演算で CPU を大量に使用する計算を行うマルチスレッド プログラムを作成しました。より具体的には、アニメーションシーケンスをフレームごとに比較するプログラムです。つまり、アニメーション A のすべてのフレームについて、アニメーション A のフレーム データをアニメーション B のすべてのフレームと比較します。異なるアニメーションに対してこの集中的な操作を並行して実行するため、プログラムは AB ペア、BC ペア、および CA ペアで作業できます。並行して。このプログラムは、QtConcurrent と、動きのあるコンテナーを関数にマップする「マップ」関数を使用しています。QtConcurrent はスレッド プールを管理します。Intel クアッド コア プロセッサで作業しているため、4 つのスレッドが生成されます。
ここでの問題は、プロセスが CPU を破壊することです。使用率は 100% 一定であり、プログラムを十分なモーション セットで実行すると、実際にブルー スクリーン オブ デスが発生します (非ページ領域でのページ フォールト)。これは、コンピューターがオーバークロックされているためだと思われます。しかし、これは私のプログラムのコーディング方法によるものでしょうか? マシンの安定性をテストするために使用したいくつかの非常に集中的なベンチマーク ツールでは、PC がクラッシュすることはありませんでした。プログラムが CPU を使用して負荷を軽減する方法を制御する方法はありますか? それとも、私は自分の問題を誤解していますか?
c++ - QFutureを使用したQProgressDialogの更新
QFutureを待機している間にメインGUIスレッドがQProgressDialogを更新するための適切な方法は何ですか。具体的には、このループの内容は次のとおりです。
現在、そこに呼び出しのようなsleep()がありますが、それは最適ではありません(もちろん、GUIのレイテンシーが発生します)。
何も入れないと、メインスレッドはpd.setValue()をループポールし、CPUサイクルを浪費します。
QCoreApplication :: processEvents(flags、maxtime)のようなものを配置したいと思っていましたが、イベントキューが空の場合はすぐに返されます。キューが空の場合でも、maxtimeなどまで待機するバージョンが欲しいのですが。そうすれば、遅延が発生し、メインスレッドは常にGUIイベントに応答する準備が整います。
c++ - Qtでの多数の同時長時間実行操作
私には、数百に及ぶ長期にわたる操作がいくつかあります。現時点では、それぞれが独自のスレッドにあります。スレッドを使用する際の私の主な目標は、これらの操作を高速化することではありません。この場合のより重要なことは、それらが同時に実行されているように見えることです。
私は協調マルチタスクとファイバーを知っています。ただし、操作でコードに触れる必要のあるものは避けようとしています。たとえば、などを使用してコードをペッパーするなどyieldToScheduler()
です。また、これらのルーチンが一口サイズのタスクアイテムのキューを発行するようにコード化されるように定型化されることを規定したくありません...それらをブラックボックスとして扱いたいです。
今のところ、私はこれらの欠点を抱えて生きることができます:
- スレッドの最大数はO(1000)になる傾向があります
- スレッドあたりのコストはO(1MB)です
コンテキストスイッチによるキャッシュパフォーマンスの低下に対処するために、idealThreadCount()スレッドのみが通常の優先度になり、残りはすべてアイドルに設定されるように優先度を調整するタイマーのアイデアがありました。これにより、タイムスライスを広げることができます。つまり、コンテキストスイッチが少なくなり、私の目的には問題ありません。
質問1:それは良い考えですか?確かな欠点の1つは、Linuxでは機能しないことです(ドキュメントによると、そこにはありませんQThread::setPriority()
)。
質問2:他のアイデアやアプローチはありますか?QtConcurrentはこのシナリオについて考えていますか?
(いくつかの関連する読み物:how-many-threads-does-it-take-to-make-them-a-bad-choice、many-threads-or-as-few-threads-as-possible、maximum-number-of -threads-per-process-in-linux)
c++ - クラスの関数メンバーでQtConcurrent::run()を使用することは可能ですか?
QtConcurrent::run()
単純な関数だけではメソッド(クラスの関数メンバー)に関連付けることができないようです。これどうやってするの?
通常の機能では、信号とその抗力を発することはできません。なぜ誰かがこれがQThread
私を超えたより良い代替案であると思うので、いくつかの入力が必要です。
qt - qtconcurrentで生成され、QTime:currentTimeを呼び出す例外
Qtconcurrent::runで作成されたスレッドでのみ例外が生成されているようです
メインスレッドと他の3つのスレッド(2つのQThreadsと1つはQtConcurrent :: run()で作成)によって呼び出されるFPSengine :: getData()という名前のメソッドを持つFPSengineという名前のクラスがあります。FPSengine :: getData()の内部でQTime :: currentTime()を呼び出します。メインスレッドまたはQThreadsの1つからFPSengine::getData()を呼び出すと問題は発生しませんが、Qtconcurrent :: run()で作成されたスレッドからFPSengine :: getData()を呼び出すと例外が発生することがあります。QtconcurrentまたはQTime:currentTime()、あるいはtzset(gdbスタックが示すものからQTime :: currentTimeによって呼び出される)に何か問題がありますか?または、私のコードに何か問題がありますか。失敗したスレッドのスタック情報は次のとおりです
。0raise /lib/libc.so.60
1 abort /lib/libc.so.6 0
2 ?? /lib/libc.so.6 0
3 ?? /lib/libc.so.604
無料/lib/libc.so.605
?? /lib/libc.so.6 0
6 tzset /lib/libc.so.6 0
7 QTime :: currentTime()/usr/lib/libQtCore.so.4 0
8 FPSengine :: xmitData FPSengine2.cpp 93
9 FPSengine: :getData FPSengine2.cpp 21
10 threadDatalog :: run threaddatalog.cpp 109
11 ?? /usr/lib/libQtCore.so.4 0
12 start_thread /lib/libpthread.so.0 0
13 clone /lib/libc.so.6 0 14 ?? 0
c++ - QFutureWatcher::progressValue は正の整数を返しますが、最小/最大は両方ともゼロです
はQFuture
双方向イテレータを繰り返し処理していますが、これが問題の根源であると思います。ただし、ドキュメントには、「QFutureWatcher::progressValue
~の間の値を返す」と書かれています。私はこのように呼んでいます: .progressMinimum
progressMaximum
QtConcurrent::filtered
QtConcurrent::filtered(myMap.begin(), myMap.end(), filterFn)
何がうまくいかないのか誰にもわかりませんか?
qt - Qt for Symbian の QtConcurrent
Qt for Symbian での QtConcurrent のサポートについて質問があります。Qt 4.6.2 を使用していますが、QtConcurrent の使用方法がわかりません。同じバージョンの QT の Wice プラットフォームではすべて正常に動作しますが、Symbian では動作しません。QtConcurrent、QFuture、QFutureWatcher を有効にする方法は?
ご回答ありがとうございます。
c++ - ワーカースレッド内に作成されたQObjectのスレッドアフィニティはどうなりますか?その後終了しますか?
QtConcurrent::run()
ワーカースレッドで関数を実行する関数を呼び出し、その関数で複数のQObjectを動的に割り当てたとします(後で使用するため)。それらはワーカースレッドで作成されたため、スレッドアフィニティはワーカースレッドのアフィニティである必要があります。ただし、ワーカースレッドが終了すると、QObjectスレッドアフィニティは無効になります。
質問:QtはQObjectを親スレッドに自動的に移動しますか、それともワーカースレッドが終了する前にQObjectを有効なスレッドに移動する責任がありますか?
multithreading - Qキャンセルして進捗状況を報告できるFuture
クラスには、、QFuture
などのメソッドがあります。これらは、。を介して監視できるようです。ただし、次のドキュメントを参照してください。cancel()
progressValue()
QFutureWatcher
QtConcurrent::run()
QtConcurrent :: run()によって返されるQFutureは、キャンセル、一時停止、または進行状況のレポートをサポートしていないことに注意してください。返されたQFutureは、実行中/終了ステータスと関数の戻り値を照会するためにのみ使用できます。
キャンセルして1回の長時間実行操作の進行状況を報告できる方法を実際に作成できる方法については、無駄に調べました。QFuture
(多分、同様の機能が可能であるように見えQtConcurrent::map()
ますが、私は単一の、長時間実行されるメソッドを持っています。)
(.Netに精通している人のために、BackgroundWorker
クラスのようなもの。)
どのようなオプションが利用できますか?
c++ - QtConcurrentを使用してPixmapをロードし、ペイントします
タイルレンダリングプログラムを作成しようとしています。ここにいくつかの基本的なコードがあります。
ヘッダ
CPP:
大きな画像のタイルをQGraphicsSceneに貼り付けるアプリケーションを作成しようとしています。ただし、すべてのタイルを一度にロードするには時間がかかり、多くのメモリを消費します。したがって、QGraphicsItemをサブクラス化し、ペイントをオーバーライドしています。QGraphicsItemクラスのpaintメソッドは、QGraphicsView内に表示されたときにのみ呼び出されます。したがって、ペイント内にタイルをロードすることで、基本的に、タイルが表示されたときにのみタイルをロードするアプリケーションを作成できます。これだけは今のところ機能しています。
ユーザーエクスペリエンスを向上させるために、QtConcurrentを使用して、別のスレッドでタイルをロードしてみます。これが私が行った変更です。
CPP
LoadTilePixmap関数:
このコードは機能するはずですが、ペイントが呼び出されるとすぐに実行時にクラッシュし続けます。temp->tileItem->paint(painter,option,widget);
ブレークポイントを追加した後、クラッシュの原因となる問題を絞り込みました。
私が得る出力は
誰かが私を助けて、lastline /paintメソッドがクラッシュする理由を教えてもらえますか?どうすれば修正できますか?
変更を更新するために編集されたコード