問題タブ [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.
python - PyQt:GUIをフリーズせずに進行状況を更新するには?
質問:
- GUI をロックせずに (「応答なし」) スレッドの進行状況を追跡するためのベスト プラクティスは何ですか?
- 一般に、GUI 開発に適用されるスレッド化のベスト プラクティスは何ですか?
質問の背景:
- Windows 用の PyQt GUI があります。
- HTMLドキュメントのセットを処理するために使用されます。
- 一連のドキュメントを処理するには、3 秒から 3 時間かかります。
- 複数のセットを同時に処理できるようにしたい。
- GUI をロックしたくありません。
- これを達成するためにスレッドモジュールを見ています。
- 私はスレッド化に比較的慣れていません。
- GUI には進行状況バーが 1 つあります。
- 選択したスレッドの進行状況を表示したい。
- 選択したスレッドが終了した場合、そのスレッドの結果を表示します。
- Python 2.5 を使用しています。
私の考え:進行状況が更新されたときに、進行状況バーを更新する関数をトリガーするQtSignalをスレッドに発行させます。また、結果を表示できるように、処理が終了したときに通知します。
このアプローチに関するコメント (欠点、落とし穴、賞賛など) を歓迎します。
解像度:
QThread クラスと関連するシグナルとスロットを使用して、スレッド間で通信することになりました。これは主に、私のプログラムが既に GUI オブジェクト/ウィジェットに Qt/PyQt4 を使用しているためです。このソリューションでは、既存のコードに実装する変更も少なくて済みます。
Qt がスレッドとシグナルを処理する方法を説明している該当する Qt の記事へのリンクは次のとおりです ( http://www.linuxjournal.com/article/9602 ) 。以下抜粋:
幸いなことに、Qt では、スレッドが独自のイベント ループを実行している限り、シグナルとスロットをスレッド間で接続できます。これは、重要なアプリケーションで必要になるすべてのブックキーピングおよび中間の QEvent 派生クラスを回避するため、イベントの送受信に比べてはるかにクリーンな通信方法です。スレッド間の通信は、あるスレッドから別のスレッドのスロットに信号を接続することになり、スレッド間でデータを交換する際のミューテックスとスレッド セーフの問題は Qt によって処理されます。
シグナルを接続する各スレッド内でイベント ループを実行する必要があるのはなぜですか? その理由は、あるスレッドから別のスレッドのスロットに信号を接続するときに Qt が使用するスレッド間通信メカニズムに関係しています。このような接続が確立されると、キュー接続と呼ばれます。キューに入れられた接続を介してシグナルが発行されると、宛先オブジェクトのイベントループが次に実行されるときにスロットが呼び出されます。代わりにスロットが別のスレッドからのシグナルによって直接呼び出された場合、そのスロットは呼び出しスレッドと同じコンテキストで実行されます。通常、これはあなたが望むものではありません (特に、データベース接続を使用している場合、データベース接続はそれを作成したスレッドだけが使用できるため、望ましくありません)。キューに入れられた接続は、シグナルをスレッド オブジェクトに適切にディスパッチし、イベント システムをピギーバックすることによって、独自のコンテキストでそのスロットを呼び出します。これはまさに、一部のスレッドがデータベース接続を処理するスレッド間通信に必要なものです。Qt のシグナル/スロット メカニズムは、上記で概説したスレッド間イベント パッシング スキームの実装の根底にありますが、よりクリーンで使いやすいインターフェイスを備えています。
注: elibenにも適切な回答があります。スレッド セーフとミューテックスを処理する PyQt4 を使用していなければ、彼の解決策が私の選択だったでしょう。
c++ - QThread のコンテキストでメソッドを呼び出す
私のアプリケーションには、メイン スレッドとワーカー スレッド ( QThread
) があります。
メイン スレッドから、ワーカー スレッドのメソッドを呼び出して、スレッドのコンテキストで実行したいと考えています。
使用QMetaObject::invokeMethod
してQueuedConnection
オプションを指定してみましたが、機能しません。
また、メイン スレッド (ワーカー スレッドのスロットに接続されている) から信号を発信しようとしましたが、これも失敗しました。
これが私が試したことの大まかなスニペットです:
QMetaObject の方法を使用する:
シグナルウェイを使用:
どちらの方法でも、メイン スレッド ID が に出力されますQThread
doWork
。
また、単純なプロデューサー・コンシューマーの実装も考えましたが、これがうまくいくなら、このようにしない理由はありますか?
c++ - QThread を終了するには?
QThread::terminate()
ドキュメントには、この関数を呼び出してスレッドを終了することは推奨されないと記載されています。
私のプログラムでは、実行が終了する前にスレッドを終了する必要があります。スレッドが負荷の高い計算を実行しているため、ユーザーが計算を停止できるようにしたいと考えています。
を呼び出す代わりに、どうすればそれを行うことができQThread::terminate()
ますか?
c++ - QThread :: wait()およびQThread :: finish()
QThread :: finish()シグナルに関連付けられたすべてのスロットを呼び出した後、QThread :: wait()は戻りますか(つまり、実行のブロックを解除しますか)?
前もって感謝します。
c++ - Qtの子スレッドで関数を呼び出しますか?
さまざまな時点で子スレッド関数を呼び出すメイン スレッドがありますが、それが Qt で正しい方法であるかどうかはわかりません。以下のコードの何が問題であり、より良い代替手段を探しています。
メインスレッドがロック子を解放するたびに、メインスレッドが無限に実行されます。
multithreading - QThread の QTcpSocket
シンプルなサーバー接続スレッドがあります。関数 receiveString を呼び出すと、失敗します。ただし、run() で同じコードを実行すると、成功します。関数 receiveString が機能するには何が必要ですか?
私は両方を試しました
実際のコード:
qt - QThread を終了するにはどうすればよいですか
最近、このタイトルで言及したように、この問題に遭遇しました。QThread::terminate() を使用してみましたが、デッド ループにあるスレッドを停止できません (たとえば、while(1))。
どうもありがとう。
user-interface - スレッド間のQtシグナリング、1つはGUIスレッドですか?
moveToThreadを使用してQtでオブジェクトをあるスレッドから別のスレッドに移動するとはどういう意味ですか? オブジェクトをあるスレッド (GUI スレッド) から別のスレッド (動作) に移動し、Qt:connect がオブジェクトの適切なスロットを呼び出す moveToThread を使用する前でも、すべてが機能しているようです。
オブジェクトが存在する場所、GUI スレッドまたはワーカー スレッドによる違いはありますか?
編集:小さなプログラムを作成しましたが、QThread がシグナルとスロット関数と共にどのように機能するかわかりません。例で moveToThread の使用法を説明していただければ幸いです
qt - 他のスレッドからのシグナルの発行
メインスレッドと他の 3 つのスレッド (2 つの QThreads と QtConcurrent::run() で作成された 1 つ) によって呼び出されるメソッドを持つクラスがあります。このメソッド内で、時々シグナルを発します。呼び出し元のスレッドに属するシグナルを発行していないため、問題が発生する可能性がありますか?
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