1

したがって、正しく理解できれば、FunctionsClassQObject を継承するクラスがあり、次のようにして呼び出した Qthread にそのクラスを設定したとFunctionClassThreadします。

FunctionsClass classObj; 
classObj.moveToThread( &FunctionClassThread );
FunctionClassThread.start();

私が理解していることから、スレッドをセットアップするこの方法は、のスロットの実行のみを処理します。つまり、何らかの理由でスロットに無限ループがある場合、FunctionsClass実行中のスレッドFunctionsClassがブロックされる可能性があります。FunctionsClass

私の質問は次のとおりです。スロットだけでなく、スレッドで FunctionsClass の関数を実行するにはどうすればよいですか? オブジェクト全体 (関数、メンバー変数など) をスレッドに配置して、そのオブジェクト全体からのコード/データのみを実行する方法はありますか? そして、スレッドがスロットの実行をどのように処理するかについての私の理解は正しいですか?

4

2 に答える 2

1

オブジェクトのメソッドを実行すると、メソッドを呼び出しているスレッドで実行されます。QObject がどこにあるかは問題ではありません。

別のスレッドで非同期的に実行されるようにメソッドを呼び出したい場合は、メッセージがポストされ、スレッドが使用可能になるまで待機するように状況を処理する必要があります (ビジーである可能性があるため、制御をスレッドに戻す必要があります)。最初にイベント ループ)、次にメソッドを実行します。

これは、通常の接続でシグナルとスロットを使用して行うことができます。そのメカニズムを使用したくない場合は、QMetaObjectを使用できますが、それらをスロットとして宣言する必要があります。Qt::QueuedConnection で呼び出された場合、静的メソッド invokeMethod は、メソッドを所有するオブジェクトが存在するスレッドでメソッドを呼び出します。メソッドに引数を渡し、メソッドから値を返すこともできます。

スレッドから別のスレッドに渡せるようにしたいデータ型は、qRegisterMetaTypeに登録する必要があり、そこで報告された条件を尊重する必要があることを考慮してください。

于 2011-11-19T10:18:31.320 に答える
0

クラスのメソッドは、それらを呼び出すスレッドのコンテキストで実行されます。QObjectクラスをスレッドに移動すると(ワーカースレッドと呼びます)、ワーカースレッドのメソッドから直接(または間接的に)呼び出されるそのクラスのメソッドのみrun()が、ワーカースレッドのコンテキストで実行されます。 。

他のスレッドからそのクラスのメソッドを呼び出したいが、それでもワーカースレッドのコンテキストで実行したい場合は、ワーカースレッドにメッセージを取得して、必要なメソッドを呼び出せるようにする方法が必要です。これは基本的に、スレッドの境界を越えたときにQt信号とスロットによって達成されることです。

余分な作業がたくさんあるので、同じことを行う方法は他に2つあります。まず、QThreadsには、オーバーライドしない場合にデフォルトで開始されるイベントループがありますrun()。イベントループに投稿できるカスタムイベントを作成して、ワーカースレッドのコンテキストで実行されるクラスのアクティビティをトリガーできます。

2番目の方法は、ワーカースレッドが監視するクラスフィールドを変更する別のスレッドからクラス内のメソッドを呼び出すことです。これらのフィールドへのアクセスがミューテックスなどのメカニズムと同期していることを確認する必要があります。

于 2011-11-19T04:49:02.530 に答える