問題タブ [qthread]
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 - Qt - ワーカー スレッドが UI をフリーズさせる
Qt でのスレッド化は初めての経験なので、ご容赦ください。
重いコードを定期的に実行するシングルトン「システム」オブジェクトがあります。UI からシステム シングルトンを制御していますが、システムは UI を認識していません。
メインにスレッドを作成し、システムをそのスレッドに移動します。
システムの定期的な処理サイクルが完了するまで、UI はハングします。
また、QThread をサブクラス化し、 runメソッドからexecを呼び出すことも試みました。
何が問題なのですか?私は確かに何か間違ったことをしています。
よろしくお願いします
python - GUI は、PyQt と Qthreads を使用すると非常に遅くなります
PyQt と Qthreads を使用して GUI の応答性を維持することに問題があります。私がしているのは、CPU が重い GUI からワーカー Qthread を生成することです。ワーカー Qthread は、数値を含むシグナルをサイクルごとに送信します。GUI では、信号は数値を取得して GUI を再描画する更新関数に接続されます。標準の Qt SIGNAL/SLOT メカニズムを使用しています。
これはすべて、PyQt、GUI、および Qthreads に関してオンラインで見つけたドキュメントと一致しているようです。問題は、ワーカー スレッドがシグナルを頻繁にトリガーするため、GUI が非常に遅くなることです。解決策は、ワーカースレッドがシグナルをトリガーする頻度を減らすことですが、進行状況をすばやく更新したいと思います。
これはすべて非常に標準的なもののようですが、適切な解決策が見つかりません。ひょっとして、デザインを変える必要があるのでしょうか?
どんな助けでも大歓迎です。
コード:
c++ - スリープ状態のQThreadをウェイクアップしますか?
スリープ中にQThreadをウェイクアップするにはどうすればよいですか?
私はバックグラウンドで実行されているスレッドを持っていて、時々目を覚まして小さなことをしますが、制御された方法でそのスレッドを停止したい場合は、彼が自分で目を覚ますのを待つ必要があります彼をやめさせる。そして、彼はかなり長く眠っているので、これはかなり迷惑になる可能性があります。
これは、基本的な問題を示す小さなサンプルコードです。
この例では5秒間スリープしてから、ドットを出力するスレッドから始めましょう。
次に、スレッドを開始してから彼を殺すメインがあります。
問題は、tt-> wait();です。スレッドがスリープしている5秒待機する必要があります。彼が続けることができるように、私はただ「睡眠からの目覚め」のようなものを呼ぶことができますか?
それとも、これを行うためのより良い方法はありますか?
/ありがとう
アップデートQMutexとtryLockで動作するようになりました。
しかし、QWaitConditionを使用する方が良いでしょうか?それとも同じですか?
更新:QMutexは、彼を開始および停止するのと同じトレッドでない場合に破損するため、QWaitConditionを試してみてください。
qt - QPluginLoader をスレッドに移動
プラグインに大きく依存するアプリケーションを構築しています。コアはシリアル インターフェイスからデータを取得し、それを各プラグインに配信して、それぞれがそれをどう処理するかを決定できるようにします。
私の設計では、QMdiSubWindow を介して MDIArea にアタッチされたウィジェットをプラグインで構築できます。これは、ミューテックスが必要になるまで機能しました。すべてが同じスレッドで実行されていたため、非常に速くデッドロックが発生しました。したがって、各プラグインを別のスレッドに移動すると、これを解決できると思いました。問題は、(今のところ) QMdiSubWindow がもう作成されていないことです。なぜこれが起こっているのかわかりません。
コアは、シグナルとスロットを使用してプラグインと通信します。
これは、プラグインをロードしてスレッドに移動する方法です。
これは元のコードを簡略化したものであることに注意してください。この記事http://www.christeck.de/wp/2010/10/23/the-great-qthread-mess/に基づいて、このアプローチ(プラグインをスレッドに移動)に従いました
registerSubWindow() は、ウィジェットを作成するプラグインのメソッドです。
これは、生成されたウィジェットを上記の MdiSubWindow として登録する、このスロットでコアによってキャッチされるシグナルを発します。
python - PyQt の QThread を使用したバックグラウンド スレッド
PyQt で作成した GUI を介して使用しているラジオとやり取りするプログラムがあります。明らかに無線の主な機能の 1 つはデータを送信することですが、これを継続的に行うには、書き込みをループする必要があり、GUI がハングします。私はスレッディングを扱ったことがないので、これらのハングを取り除こうとしましQCoreApplication.processEvents().
た。
QThread を使用してこれを修正する簡単な方法はありますか? PyQt でマルチスレッドを実装する方法に関するチュートリアルを探しましたが、それらのほとんどはサーバーのセットアップを扱っており、必要以上に高度です。正直なところ、スレッドの実行中に何かを更新する必要はありません。スレッドを開始し、バックグラウンドで送信し、停止するだけです。
qt - Qt-ワーカースレッドの不思議なsegfaults
ワーカースレッドでQSystemDeviceInfoをインスタンス化していますが、セグメンテーション違反が発生します。
クラスはスレッドセーフですか、それとも問題は他の場所にありますか?
編集:さらにデバッグすると、ネイティブのSymbianがsegfaultも呼び出すことに気付きました。
よろしくお願いします
c++ - QThread 関数を保護して、前の作業が完了するまで再度呼び出されないようにするにはどうすればよいですか?
私は QThread を使用しており、そのrun
メソッド内には、時間がかかる重いアクションを実行する関数を呼び出すタイマーがあります。通常、タイマーをトリガーする間隔よりも長くなります (常にではありません)。
必要なのは、このメソッドを保護して、前のジョブが完了した場合にのみ呼び出すことができるようにすることです。
コードは次のとおりです。
c++ - Windows XP のシングル コア CPU での Qt スレッドの問題
Qt を使用してクロスプラットフォームのフラクタル エクスプローラーを開発しています。特に Windows XP (MSVC Express 2010 でコンパイルされたプログラム) でシングル コア CPU を実行しているときにパフォーマンスの問題が発生しています。他のバージョンの Windows は試していません。2 つのコアを使用すると、プログラムは正常に動作します。また、1 コアまたは 2 コア (GCC でコンパイル) の Linux でも問題なく動作します。
パフォーマンスの問題は、計算スレッドのシグナルを介してウィジェットのスロットを呼び出すことに関係しています。ウィジェットには QImage が含まれており、そのピクセルへのポインターを計算スレッドに渡します。スレッドはフラクタルを計算し、ピクセルを画像にプロットします。各行の終わりに、スレッドはシグナルをウィジェットに送信して、メイン スレッドの表示を更新するように指示します。私が理解しているように、これはキュー接続です。
Windows と単一の CPU では、更新は非常に遅く、計算よりもはるかに遅くなります。プログラムが使用できなくなります。
関連するコードは、Qt ドキュメントのマンデルブロの例に似ていますが、Qimage はスレッドではなくウィジェットにあり、QImage を QPixmap に変換しないため、シグナルに引数がないことを除きます。
問題が何であるか、そしてそれを解決する方法について何か考えを持っている人はいますか? スケジューリング、タイムスライスの割り当てと関係がありますか? MSVC に設定が必要なコンパイラ フラグはありますか? または、プログラムを何らかの方法で変更する必要がありますか?
どうもありがとう!
qt4 - qtスレッドを使用してウィジェットにアクセスする方法は?
私のプログラムには、テキストボックスとqthreadポインタを備えたウィジェットクラスがあります。qthreadポインターを使用して、アプリケーションに影響を与えることなく、テキスト選択によってテキストボックスを継続的に更新したいと思います。しかし、テキストボックスにアクセスできません。ただし、パラメータをqthreadに渡すことでテキストボックスにアクセスします。テキストボックスにアクセスしてテキスト選択を数回更新すると、アプリケーションが自動的に終了してエラーが表示されます
list_thread:../../src/XlibInt.c:596:_XPrivSyncFunction:アサーション `(dpy-> flags&(1L << 3))!=0'が失敗しました。
qt - QThread が停止しない / シグナルを処理しない
別のスレッドでいくつかの作業を実行し、作業が完了したらそのスレッドを停止しようとしています。
このような接続を設定しました
しかし、終了した()シグナルを発したときに、quit()スロットが呼び出されることはありません。コマンド ラインには、失敗した接続に関連する警告は表示されません。
問題を絞り込むために簡単なテスト プロジェクトを作成しましたが、同じ動作が得られます。
TestClass.h:
TestClass.cpp:
そしてmain.cpp:
だからここに私が起こると予想したものがあります:
- 処理が完了
testThread.start()
すると、スレッドのrun()
関数が呼び出され、内部的exec()
にイベント ループが呼び出されて開始されます。さらに、シグナルをスローしstarted()
ます。 testClass
doWork()
と呼ばれるスロットを持っています。- 完了すると、シグナル
TestClass::doWork()
がスローされます。finished()
- のイベントループは
testThread
シグナルを受信し、それをそのquit()
スロットに転送します testThread.wait()
スレッドが終了したため、待機から戻ります。
ステップ 1 ~ 3 が機能し、qDebug()
出力が得られます。問題はステップ 4 にあります: シグナルが発生し、いくつかのイベント ループに転送されます (少しデバッグしましたが、どのイベント ループに発生したのかわかりませんでした) が、quit()
スロットは呼び出されません。
私は何を間違っていますか?
PS: 代わりに QThread をサブクラス化することを提案しないでください。私がこの方法を試しているのは、QThread のサブクラス化を避けたいからです。