在 Qt 中,一个线程对象可以通过信号与槽机制向其他线程发送信号。下面是一个简单的示例代码:
#include <QThread>
#include <QDebug>
class MyThread : public QThread {
Q_OBJECT
signals:
void mySignal(QString message);
public:
void run() override {
// 在此处编写需要在线程中执行的代码
for (int i = 0; i < 10; i++) {
qDebug() << "Running in thread: " << QThread::currentThreadId();
emit mySignal("Hello from thread");
msleep(1000); // 线程休眠1秒钟,模拟耗时操作
}
}
};
class MyObject : public QObject {
Q_OBJECT
public slots:
void mySlot(QString message) {
qDebug() << "Received signal in thread: " << QThread::currentThreadId() << ", message:" << message;
}
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// 创建线程对象,并启动它
MyThread thread;
thread.start();
// 创建另外一个QObject子类对象,用于接收MyThread发送的信号
MyObject obj;
// 将obj和thread连接起来
QObject::connect(&thread, &MyThread::mySignal, &obj, &MyObject::mySlot);
return app.exec();
}
在上面的代码中,我们定义了一个继承自 QThread
的 MyThread
类,在其中重载了 run()
函数,并定义了一个名为 mySignal()
的信号。
当线程运行时,在 run()
函数中通过 emit
关键字来发射该信号,并传递了一个参数。
同时,我们也定义了一个名为 MyObject
的 QObject 子类,在其中定义了一个名为 mySlot()
的槽函数,用于接收线程发送的信号。
在主函数中,我们创建了一个 MyThread
对象和一个 MyObject
对象,并使用 QObject::connect()
函数将它们连接起来。这样,当线程对象发射信号时,与之相连的槽函数就会被调用,从而完成跨线程通信。
需要注意的是,在使用信号与槽机制进行跨线程通信时,应当确保槽函数运行在正确的线程中。如果不确定当前所在的线程是否正确,请使用 QMetaObject::invokeMethod()
函数将其放入到目标线程的事件队列中执行。