問題タブ [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.

0 投票する
1 に答える
127 参照

qt - QFutureIterator::次のセグメンテーション違反

次の Qt コードがありますnext()。私はコードを調べましたがQtConcurrent、なぜ失敗したのかは明らかではありません。

失敗するポイントは次のとおりです。


アップデート:

の同じクラッシュQFuture::const_iterator


ノート:

私がGDBを信じることができれば、thisQVector::at ある0x0mapIterator.value().resultそれから私はすでに であると仮定しますnullptr、なぜ、私にはわかりません。

0 投票する
1 に答える
963 参照

c++ - QtConcurrent::run 関数をプロキシする Variadic テンプレート

QtConcurrent::run 関数の前にある可変個引数テンプレート関数を作成して、いくつかの処理を行ってからパラメーターを渡すことを望んでいました。

QtConcurrent::run は非常にオーバーロードされています - qtconcurrentrun.hをチェックしてください

QtConcurrent::run に渡される、呼び出すことができる可変個引数テンプレート関数を作成することは可能ですか? これは私がこれまでに持っているものです:

戻り値の型を推測する方法を見つけるのに苦労しているので、別のテンプレート パラメータとして returnT を取得しました。これは、次のコマンドで呼び出された場合にコンパイルされません (VS2012 Nov CTP):

上位の 2 つのエラー メッセージは次のとおりです。

どんな助けでも大歓迎です。

0 投票する
1 に答える
162 参照

c++ - QtConcurrent::run() は __stdcall/WINAPI 関数を受け入れません

__stdcallを使用して呼び出し規則を持つ DLL 関数を実行しようとしましたがQtConcurrent::run()、コンパイル エラーが発生します。

問題を次のコード例に減らしました。

コードを削除する__stdcallと、コンパイルして正常に実行されます。そうしないと、次のコンパイル エラーが発生します。

なぜこのようなことが起こるのでしょうか? また、最善の回避策は何ですか?

0 投票する
1 に答える
760 参照

c++ - Set default stack size for future QThreadPool threads and/or pthread_create calls

I'm using QtConcurrent/QThreadPool and it is creating threads with a stack-size that is too small on Mac OS X 10.8 (512kB) but fine on CentOS 5.9 (10MB).

I'm hoping there is a workaround where I can set some process-wide default for new threads' stack size. I only care about POSIX-like systems (Mac and Linux) and not Windows for the time being.

My question is how do I set the default stack-size for new QThreadPool threads either from within the program or via an environment variable or other means prior to running the program?

Answers for achieving the effect by setting the default for threads created by pthread_create will also be useful.


Where I'm at with my attempts to solve this problem:

My hunch is that Qt is using pthreads under the hood and that if I can change the default stack-size for pthreads my problem might be solved.

The pthread documentation says:

DESCRIPTION

The pthread_create() function is used to create a new thread, with attributes specified by attr, within a process. If attr is NULL, the default attributes are used. etc...

I know how to get the default value:

But I have not found a way to set the default value - only to set the size by passing a pthread_attr_t to pthread_create.

Is there a way to set the default?

Is there some environment variable or other means to influence the default?

0 投票する
2 に答える
1434 参照

c++ - QtConcurrent エラー: 非静的メンバーへの参照

OS-X 10.8.4 を搭載した Mac で Qt 5.1 と QtQuick 2.0 を実行しています。

ファイル I/O 操作でイベント ループをブロックしているため、Qt-QML GUI が応答しなくなります。これを解決するための通常のアプローチは、Will Bickfordがここで説明しているように、複数のスレッドを使用することです。

そうするために、私は使用しようとしています:

これは、明示的な QFuture オブジェクトを使用するよりも簡単です。私はQtのドキュメントクールな例を読んでいて、次のコードが機能するようになりました(このをモデルにしています):

DataObject のヘッダー ファイルと実装ファイルは次のとおりです。


これはあまり現実的ではありませんが、以下で遭遇した問題を説明するための簡単なスケッチとして役立ちます。

追加の「datamodel.h」クラス内に QtConcurrent::blockingMapped() をカプセル化しようとすると、問題が発生します。


そして main() は次のようになります (load() メソッドも DataModel クラスに移動したことに注意してください):

しかし今、コンパイルエラーがあります:

DataObject または DataModel インスタンスを初期化しても (非静的メンバー関数が表示されるように) コンパイラ エラーを修正できず、他に何を試せばよいかわかりませんでした。

次に、これはQtConcurrent 引数を設定するときの「ファンクター」バインディングの問題が原因である可能性があると思われました (boost がインストールされていないため、boost::bind を使用していませ)。:

と:

コードを与える:

非静的メンバー エラーは発生しなくなりましたが、新しいエラーが発生します (上記の行を指しています)。

私は本当にこれでうさぎの穴に落ちました。おそらく単純な間違いですが、それを整理するのに苦労しています.

誰か助けてくれませんか?

0 投票する
2 に答える
1636 参照

c++ - QtConcurrent のマッピングと進捗レポート

QtConcurrent を使用して重い背景画像処理を行っていますが、画像の一部が徐々に更新されている間に画像を表示したいと考えています。画像の各行は個別に計算され、ファンクタに渡されます。

完全な画像を計算するには、QtConcurrent に渡すアイテムのシーケンスをマップし、計算が完了すると各行が信号を発します。

クラス Worker のインスタンス化は次のとおりです。

進行状況を報告するスロットは次のとおりです。

今の使い方:

すべてのシグナルが発行されますが、スロット onProgressUpdate は Qtconcurrent::mapped がシーケンス内のすべてのアイテムで完了した場合にのみ呼び出されます。

実行すると、シーケンスの処理中に大きな遅延が発生し、その後すべてのスロットが順番に実行されます。

すべてのタイプのシグナル/スロット接続を試しましたが、どれもこの動作を変更しませんでした。

どんな手掛かり ?

++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++ Shf 提案後の編集 +++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++

呼び出しは今までメイン (gui) スレッドで行われていました。呼び出しを次のように変更しました:

別のスレッドで実行されるようになったため_computeTreeForFrame、QtConcurrent::mapped への呼び出しを次のように変更しました。

これにより、以前とまったく同じ動作が発生します。

++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++ マレク R 提案後の編集 ++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++

わかりましたので、テストを行いました。ここに私が観察したものがあります:

QtConcurrent::map :

  • 信号を出さないresultReadyAt(int)

QtConcurrent::mapped

  • 終了resultReadyAt(int)時のみ出力

map 関数の呼び出しが別のスレッドで行われても、同じ動作が発生します。

progressValueChanged(int)Qt progressDialog の例が示すように、シグナルも試しました。信号は、画像の 2 行 (最初と最後)progressValueChanged(int) に対してのみ発せられます。これは、Qt の進行状況ダイアログの例ではスムーズに出力されるため、非常に奇妙です。

メイン スレッドとは別のスレッドでマップ関数を起動するように Qt の例を少し変更しましたが、その場合でも問題なく動作します。

問題は別の場所から発生する必要があります。

GUI イベント ループが予期しないことを行っている可能性があります。私には何の手がかりもありません。

QtConcurrent::mappedReduced を試して、結果を報告します:-)

++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++ QtConcurrent::mappedReduced を試した後の編集 +++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++

「マップ」機能が完了した場合にのみ機能せず、「縮小」機能を呼び出します。つまり、以前のシグナル/スロットメカニズムと同じことを行います。

私は今、可能性が少なくなりつつあります

++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++ 編集 Qt の進行状況ダイアログに近いソリューションに戻りました例 ++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++

Qt の例と同じ動作が得られない場合は、何かが間違っているに違いありません。

コードは次のとおりです。

computeTreeForFrame の呼び出し...

この呼び出しはslot で行われます。

前に述べたように、行 0 と最後の行のシグナルを送信しますが、他には何も送信しません。

これは Qt の例とまったく同じではないでしょうか?

0 投票する
1 に答える
5162 参照

c++ - QtConcurrent を QVector の QList にマップする方法1 つの QVector に縮小します

この作品を作るために、私が知っているすべてを組み合わせようとしました。現在の構造でデッドロックやその他のスレッドの問題は発生しないと思います。ただし、いくつかの部分が欠落しており、利用可能なドキュメントは役に立ちません (私は C++ ドキュメントの経験がありません)。

すべてが 1 の 3 つのベクトルを保持する QList の入力から、すべてのベクトルがいくつかの反復変数を追加した 1 つのベクトルに入りたいと思います。結果として、次のことが期待qDebug()できます。

ここで、私が不足していると思われるものは次のとおりです。

  • についてはどうですかQtConcurrent:mappedReduced()、正しい引数を与えていますか?
  • 関数の戻り値についてはどうですか、これらをどのように整理する必要がありますか?
  • 正確に何を含める必要がありますか? QtConcurrent を含めるだけでよいですか?
  • これが機能し始めると、QtConcurrentがスレッド管理を行い(利用可能なコアを使用する)、リストのすべてのアイテム(サイズが同じでなくても)がスマートに渡されることを理解している限り、リストは巨大になります。スレッドをアイドル状態にしないようにしますか?

編集 (ボタンのクリックで発生するのは問題でしょうか?):

私の例では機能していましたが、これを使用すると何が問題になる可能性がありますか:

チョークオン:res = QtConcurrent::mappedReduced(holder, correlate, Reduce, QtConcurrent::SequentialReduce);

変数:QList< QVector<double> > holder;

関連する機能:

エラー: 呼び出しに一致する関数がありません'mappedReduced(QList<QVector<double> >&, <unresolved overloaded function type>, <unresolved overloaded function type>, QtConcurrent::ReduceOption)'

また、「テンプレート パラメーター ResultType を推測できませんでした」

コンソールアプリで動くものと同じです。

0 投票する
3 に答える
12363 参照

multithreading - QtConcurrent::run によって開始されたスレッドを停止しますか?

関連する QFuture オブジェクトによって Thread を停止することは可能ですか? 現在、私はこのようなビデオキャプチャプロセスを開始しています。

startLiveCapturing-Method 内では、画像をキャプチャして表示する無限ループが実行されています。そのため、ユーザーがそのプロセスを停止したい場合は、ボタンを押すだけで操作が停止します。しかし、このようにキャンセルメソッドを呼び出してこのスレッドを停止することはできないようです?

私が間違っていることと、そのスレッドまたは操作を停止するにはどうすればよいですか。

0 投票する
1 に答える
2443 参照

c++ - QtConcurrent を使用した QT でのマルチスレッド

ある時点で一連のビデオを処理する Qt でアプリケーションを開発しています。正常に動作しますが、プロセス段階での CPU 使用率は 40 ~ 60% しかなかったので、マルチスレッドにしようとしました。

私はQtConcurrentを使用して、より伝統的なスレッド管理の代わりに彼の「高レベル」を引き起こしました。私のコードは単純です:

aaaand それは動作し、CPU 使用率は 100% で、約 25 ~ 30% 高速です。ただし、約 65 の新しいスレッドが生成され (25 または 250 のビデオを処理するかどうかに関係なく)、それらのスレッドのほとんどはプロセス フェーズの後も消えません。

私の質問は次のとおりです。このアプローチは正しいですか? 生すぎない?スレッドの作成を「手動で」制御する必要がありますか? QtConcurrent モジュールがすべてを処理するので、スレッド管理を気にする必要はありませんか? 85 スレッドは多すぎますか? プロセス段階の後にそれらのいくつかを殺そうとする必要がありますか??

アクティビティモニターを見るだけで、すべての観察が行われました。

前もって感謝します。