問題タブ [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.
qt - QThread/QDialogを使用した競合状態
次のシナリオでは、競合状態を回避しようとしています。
QDialog :: exec()がダイアログを設定する前にスレッドが終了すると、シグナルによってトリガーされた「accept()」呼び出しは失われ、ダイアログは自動的に閉じません...
したがって、理想的には、ダイアログがスレッドを処理する準備ができた後でのみスレッドを開始したいのですが、これをどのように行うのでしょうか?
multithreading - QThread に関する質問
QThread を作成し、そのスロットの 1 つを別のスレッドから呼び出した場合、それは QThread オブジェクトのスレッドのコンテキストで呼び出されますか、それとも呼び出しを行ったスレッドのコンテキストから呼び出されますか?
qt - メインスレッド外で QDialog を作成する方法
処理用のスレッドと可変量のウィンドウ インスタンスの両方を必要とするクライアント アプリケーションを QT で作成しようとしています。しかし、処理スレッドの 1 つの中に新しいウィンドウを作成する方法を見つけようとして苦労しています。すべての ui 要素を QApplication クラスと同じスレッドで作成する必要があることは理解していますが、インスタンス化できる必要があるか、少なくとも別のスレッドで QDialog への参照が必要です。
スレッドと QDialog の間の通信はシグナルを使用して行うことができます。これについては心配していませんが、実際にウィンドウを作成することは別の問題です。シグナルを使用して、ウィンドウへのインスタンスを作成するようメイン スレッドに指示し、そのインスタンスへのポインターを何らかの方法で取得することもできますが、それは少し複雑で見苦しく思えます。そのようなタスクを達成するためのより良い方法はありますか? メインスレッドの外でQDialogを作成するには、QApplicationクラスが存在していましたか?
編集: Q_INVOKABLE メソッドを試しましたが、複数のスレッドで機能しません。指定したタイプの QDialog を作成し、それへのポインタを返すビュー ファクトリ クラスを作成しました。このクラスはメイン GUI スレッドでインスタンス化され、このクラスへの参照がすべてのワーカー スレッドに送信されます。問題は、スレッドが Qt::BlockingQueuedConnection を使用してファクトリから create メソッドを呼び出すと、invoke メソッドが失敗することです。Qt::DirectConnection に変更すると、invoke メソッドは正しい create メソッドを呼び出しますが、現在のスレッドではワーカー スレッドとして呼び出されます。
私の主な機能は次のようになります:
そして、ClientApp スレッドからの実行関数は次のようになります。
私が言ったように、接続タイプを Qt::DirectConnection に変更しても、invokeMothod は失敗しないため、params は問題ではなく、別のワーカー スレッドでメソッドを呼び出します。
c++ - Qt moveToThread()と、それぞれを使用するときに新しいスレッドを呼び出す
スレッド化されたアプリケーションでこの各関数呼び出しを使用するのはいつですか。バッファへのデータの読み取り/書き込み(キュー操作)を処理する同じクラスで定義された2つの関数fun1()とfun2()が与えられます。これらへのマルチスレッドを実現します。2つの関数を別々のスレッドで実行する必要があります。ここで、最初に読み取られた関数がそのスレッドの開始時に呼び出されたとしましょう。
最初の関数スレッドの開始時に関数の書き込みにmoveTothread(2番目のスレッド)を使用する方が良いですか
または
新しいスレッドクラスで2番目の関数を定義し、最初のスレッドの開始時にそのスレッドを呼び出します。
qt - QThread の使用法を理解するのを手伝ってください
私はMainWindow w
窓を持ってTestThread testThread
おり、のメンバーとしてw
。単純なことはわかっていますが、testThread.foo()
メソッドをtestThread
スレッドで実行できません(ウィンドウスレッドではありません)。つまり、QThread の動作がわかりません。
次のテスト アプリケーションの修正にご協力ください。QProgressBar *MainWindow::ui::progressBar
とQPushButton *MainWindow::ui::startButton
(簡単に書くと)があります。毎秒インクリメントする(startButton
クリックで)開始したい。TestThread::foo(int* progress)
int progress
メインウィンドウ:
テストスレッド:
わかりました、これは簡単です。私は何か間違ったことをしています:)
PS動作を理解するために、最も単純な(可能な限り)例を実行したいと思いQThread
ます。
ありがとう!
c++ - 実行中のスレッドの関数を新しいスレッドに移動しますか?
クラスファイルに読み書き機能があります。このクラスはクラスをサブクラス化QThread
し、run をオーバーライドします。シグナルとスロットはありません。基本的にスレッドでデータ処理関数を実行します。そのコンストラクターには method がありmovetothread(this)
ます。2 つの関数でキューを形成し、マルチスレッドを実装するmovetothread(secondthread)
には、書き込み関数で呼び出しを行うことができますか?
書き込み関数を別のスレッドで実行するようにします。書き込み機能はいつ、どのように停止しますか?
c++ - qthread サブクラスの run メソッドとスレッド コンテキストを理解する
私はたくさんのメソッドを持つエンコーダークラスを持っています。これは Qthread のサブクラスです。私はマルチスレッドが初めてで、
このクラスがどのようにメソッドをスレッド化しているかを理解しようとしています
... qthread のサブクラスになければならないメソッドをスレッド化することを理解しています。これを実行すると、このクラスのスレッド化されたコードが実装されます。そして、スレッドは、このクラスのオブジェクトで start メソッドが呼び出されたときにのみ開始されます。
質問: まず、この実行の実装から何を推測しますか?
質問:スレッド コンテキストとは、そのメソッドに関連して何を意味しますか。
また
質問:このクラスのスレッドが開始される前に、このクラスのメソッドが呼び出された場合はどうなりますか?
c++ - QThreadのイベントループが別のスレッドからいつ開始されたかを知る
私のプログラムでは、QThreadをサブクラス化しており、次のrun()
ように仮想メソッドを実装しました。
ここで、別のスレッド(これをMainThread
)で開始し、そのシグナルManagerThread
を待ちstarted()
ます。その後、で処理する必要のあるシグナルとスロットの使用に進みますManagerThread
。ただし、started()
シグナルは基本的に呼び出される直前に送信run()
されるため、スレッドスケジューリングによってはMainThread
、イベントループがまだ開始されていないため、からのシグナルが失われます。
(編集:それは問題ではないことがわかりました、それは信号が時間内に接続されていないだけですが、同じ理由で)
電話をかける直前に信号を発することができましたexec()
が、それも問題を引き起こしています。
イベントループが開始されたことを知るための明確で簡単な方法はありますか?
ありがとう!
EDIT2 :(解決策)
了解しました。問題は私が言ったとおりではないことがわかりました。イベントループが開始されていないという事実は問題ではありません。シグナルは開始されるまでキューに入れられるはずだからです。started()
問題は、呼び出される前に信号が発信されるため、一部の信号が呼び出されるのに間に合わないことrun()
です。
解決策は、すべての接続の後、実行の直前に別のカスタム信号を発行することです。これにより、すべての信号/スロットが確実に接続されます。
これは私の問題の解決策ですが、実際にはスレッドのタイトルに対する答えではありません。タイトルに答える答えを受け入れました。
instance()
好奇心旺盛な人のために、以下のすべてのコードを残しました。解決策は、メソッド内の別のシグナルを待つことです。
コード:
多くの人が私はシグナルを失うことはできないと言っているので、これが私のクラス全体の実装です。必要なものだけに簡略化します。
これがへのインターフェースManagerThread
です:
いくつかの関連する実装。スレッドのシングルトンインスタンスの作成:
シグナル/スロットを設定し、イベントループを開始する実行の再実装:
処理を正しいスレッドに委任する関数。これは私が失われた信号を発するところです:
MainThread
最後に、イベントループが時間内に開始されない場合に失敗するコードは次のとおりです。
ハンドラーがテキストを出力するだけだとすると、実行が成功すると次のように出力されます。
ManagerThreadが開始するの
を待っていますManagerThreadスレッドが開始するのを待っています。
ManagerThreadでイベントループを開始します
ManagerThreadが何か
BLAMを実行しようとしています!
そして、これが失敗した実行で何が起こるかです:
ManagerThreadが開始するの
を待っていますManagerThreadスレッドが開始するのを待っています。
ManagerThreadが何かをしようとしている
ManagerThreadでイベントループを開始する
明らかに、イベントループは信号が発信された後に開始され、BLAMは出力しません。ここには競合状態があり、それを修正するには、イベントループがいつ開始するかを知る必要があります。
多分私は何かが欠けています、そして問題は何か違うものです...
実際に読んでくれてありがとう!ふぅ!