线程继承QThread , 线程包含了IEC104Master* iec104Master 对象, 每个 QObject 对象都必须与一个线程相关联,以确保线程安全。请写个例子说明
时间: 2024-03-09 14:45:33 浏览: 60
好的,这里是一个简单的例子:
```cpp
#include <QCoreApplication>
#include <QObject>
#include <QThread>
#include <QDebug>
class IEC104Master : public QObject
{
public:
IEC104Master(QObject *parent = nullptr) : QObject(parent) {}
public slots:
void doWork()
{
qDebug() << "IEC104Master::doWork() thread: " << QThread::currentThread();
}
};
class MyThread : public QThread
{
public:
MyThread(QObject *parent = nullptr) : QThread(parent) {}
protected:
void run() override
{
qDebug() << "MyThread::run() thread: " << QThread::currentThread();
IEC104Master *iec104Master = new IEC104Master();
iec104Master->moveToThread(this);
QObject::connect(this, &MyThread::started, iec104Master, &IEC104Master::doWork);
exec();
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "Main thread: " << QThread::currentThread();
MyThread thread;
thread.start();
return a.exec();
}
```
在这个例子中,我们创建了一个 MyThread 对象,它继承自 QThread。在 MyThread 的 run 函数中,我们创建了一个 IEC104Master 对象,并将它移动到了 MyThread 所在的线程中。然后我们连接了 MyThread 的 started 信号与 IEC104Master 的 doWork 槽,这样当线程启动时,就会调用 IEC104Master 的 doWork 函数。在 IEC104Master 的 doWork 函数中,我们输出当前线程的信息。最后,在主线程中调用 QApplication 的 exec 函数,进入事件循环,等待程序退出。当程序运行时,我们会看到如下输出:
```
Main thread: QThread(0x7fff8e8d4c50)
MyThread::run() thread: QThread(0x7fff8e8d4d20)
IEC104Master::doWork() thread: QThread(0x7fff8e8d4d20)
```
可以看到,MyThread 和 IEC104Master 的 doWork 函数运行在同一个线程中。这就是通过将 IEC104Master 移动到 MyThread 所在的线程中来实现的。注意,在这个例子中,我们将 IEC104Master 移动到了 MyThread 所在的线程中,而没有将主线程和 IEC104Master 连接起来,因此 IEC104Master 的成员函数只会在它所属的线程中运行。
阅读全文