問題タブ [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++ - QByteArrayでQtConcurrentをqCompressに使用するには?
QByteArray の qCompress を使用して、ディレクトリからすべてのファイルを圧縮する小さなプログラムを書きたいと思います。
ただし、QtConcurrent を使用してマルチスレッド環境で圧縮を実行したいと考えています。しかし、私にはいくつかの問題があります。
ここに私のコード:
問題は、コンパイラがエラーを発生させることです
最初:filtered(&QByteArray,)の呼び出しに一致する関数がありません。
2 番目: QList から非スカラー型 QByteArray への変換が要求されました。
だから、私の質問は、私がやりたいことをすることは可能ですか?
前もって感謝します
qt - QtConcurrent::run => QWaitCondition: スレッドがまだ待機している間に破棄されました
ループ内でN 個のスレッドを起動し、別のループでそれぞれを待機した後、「QWaitCondition: スレッドがまだ待機している間に破棄されました」というメッセージが表示されます。
コードは次のとおりです。
各スレッドを待っている間、なぜこれが起こっているのかわかりません。
c++ - 多くのスレッドを使用した QtConcurrent と QThread のマルチスレッド パフォーマンス
アプリケーションが、CPU コア/スレッドの数よりも多い数の複数のスレッドで関数を実行する必要があるとします。1 つの方法はQtConcurrent
、最大スレッド数を使用して設定することです。
別の方法は、複数のオブジェクトを持ち、次を使用してそれらを別のスレッドに移動することmoveToThread
です。
スレッドの数は CPU コアの数よりも多いため、実行時にスレッドを異なるコア間で切り替える必要があります。
問題は、2 つのアプローチのパフォーマンスが異なるかどうかです。つまり、 の切り替えは、QThread
を使用して実行されるものとは異なりますQtConcurrent::run
か?
c++ - QtConcurrent::runでポインタをパラメータとして非クラスメンバー関数を呼び出す方法は?
Qt 4.8 for Embedded Linux を使用して、特定のフォルダーとそのすべてのファイルを消去するために使用される、再帰的な非クラス メンバー関数を呼び出したいと考えています。
(try-catch は忘れてください。それらは「デバッグ」用でした)
ご覧のとおり、この関数は QProgressDialog のようなクラスへのポインターと整数へのポインターの両方をパラメーターとして受け取ります。QProgressDialog のようなクラスは、削除操作の進行状況でインターフェイスを更新し、整数には削除されたファイルの実際の数が格納されます。
私が抱えている問題は、QtConcurrent::run を使用してこの関数を呼び出すと、セグメンテーション違反、アライメント トラップなどが常に発生することです。
関数を直接呼び出しても同じことは起こらないので、おそらく関数や ProgressDialog クラスの問題ではないことがわかります。そして、これをより注意深くデバッグするためにアクセスできる GDB がありません (GDB と Python のおかげです)。
したがって、私の質問は基本的に次のとおりです。私は何を間違っていますか? そして、エラーなしでこれを行うにはどうすればよいですか?
追加情報:
- 今のところ、ProgressDialog と整数の両方が .cpp ファイルでグローバルですが、それらはしばらく前にローカルであり、問題はすでに存在していました。
- main() の最後の「return」関数でアプリを閉じるときにのみ、セグ フォールトが表示されることがあります。ただ、このままではクリア作業を終える前に問題が発生してしまいます。
c++ - QProgressDialog が表示されない場合、QtConcurrent::map がクラッシュする
SLOT
私のメインスレッドで、ボタンによってトリガーされた this を考えてみてQTreeWidgetItem
くださいQTreeWidget
。呼び出しを使用しQtConcurrent::map()
て長いタスクを実行します。がにwatcher
接続され、QProgressDialog
進行状況が表示されます。
また、UI (以前のすべてのウィジェットを保持する) にQProgressBar
、同じ SIGNALS/SLOTS を持つ を追加しました。以前のようにコードを維持すると、期待どおりに動作します。進行状況ダイアログが表示され、進行状況バーがダイアログとまったく同じように更新されます。代わりに、コメントすると
または、何らかの方法でダイアログを非表示にすると、プロセスがクラッシュします (常にではなく、うまくいく場合もあります)。それを見るqDebug() << item->text(4);
とクラッシュし、出力にはランダムに混合されたテキストが表示されます (それらはファイル名であるはずです)。QProgressDialog
また、計算がクラッシュしなくても、 が表示されていない場合、進行状況バーは更新されません。
注:以前に別の関数で同様の問題が発生し、設定することで解決しました
Windows のみで、OSX は問題ありませんでした。
QProgressDialog
では、すべてを正しくする の背後にあるトリックは何ですか? QProgressBar
の代わりにを使用する方法はありQProgressDialog
ますか?
ノート
これは、プロセスが問題なく完了したときの出力です。
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 がなくてもうまく機能することを忘れないでください)。