別のスレッドからオブジェクトにアクセスする方法は何ですか。
Qtではオブジェクトをスレッド間でアクセスする方法は、シグナル&スロット機構とイベントキューの2種類が用意されています。
- シグナル/スロット機構:シグナルとスロットを定義することで、異なるスレッド間でスレッド間の通信を実現できます。オブジェクトのメソッドでシグナルを定義し、別のスレッド内でこのシグナルを対応するスロット関数に接続します。シグナルが送信されると、スロット関数が別のスレッドで呼び出されます。
サンプルコード:
class MyObject : public QObject
{
Q_OBJECT
signals:
void mySignal();
public slots:
void mySlot()
{
// 槽函数
}
};
// 在另一个线程中连接信号和槽
QThread* thread = new QThread;
MyObject* object = new MyObject;
object->moveToThread(thread);
QObject::connect(object, SIGNAL(mySignal()), object, SLOT(mySlot()));
thread->start();
// 在另一个线程中发射信号
emit object->mySignal();
- イベントキュー:オブジェクトのイベントキューにイベントを送信することで、異なるスレッドからオブジェクトのメソッドにアクセスできます。オブジェクトのメソッドにアクセスする必要があるスレッドでは、QMetaObject::invokeMethod() メソッドを使用してメソッド呼び出しをオブジェクトのイベントキューに追加します。
ネイティブの日本語では、文を言い換えてください。1つのオプションのみが必要です。
class MyObject : public QObject
{
Q_OBJECT
public slots:
void mySlot()
{
// 槽函数
}
};
// 在另一个线程中访问对象的方法
MyObject* object = new MyObject;
QMetaObject::invokeMethod(object, "mySlot");
イベントキューを使用する場合、呼び出されるメソッドは必ずスロット関数であり、オブジェクトは対象スレッド内で作成する必要があります。