Qt多线程的实现

本文介绍了在Qt中实现多线程的两种方法:子类化QThread和子类化QObject配合MoveToThread。通过实例说明了不同方法中线程执行的逻辑,并指出直接调用QObject成员函数可能在其他线程中引起的问题,如‘QObject::killTimer: timers cannot be stopped from another thread’错误。
摘要由CSDN通过智能技术生成

Qt多线程的实现

        这个内容中提到的方法来自网络,去年看的,保存了下来,没记住出处,前几天用OpenCV时试了一下,可行,就想在此记录一下。

        在Qt中使用多线程,目前就我使用过的有两种,一是子类化QThread,重写run函数,在run函数里实现自己的代码,这一部分代码通常是比较耗时,或者干脆直接阻塞的。比如一个while循环,设置一个标志,判断循环结束。
         
这样写的话,会有一些东西需要了解。
        子类化QThread的方法,只有run函数里面的内容是执行在子线程里的,其他的部分,比如槽函数什么的还是在主线程里执行(假设是在主线程开启的该子线程)。
        还有一种方法,是子类化QObject,新建一个线程,然后使用MoveToThread把这个类的对象移到新建的线程中,

Qt提供了一些多线程类和网络类,可以很方便地实现TCP通信。下面是一个简单的例子: 1. 创建一个继承自QObject的MyTcp类,用来处理TCP通信的相关操作。 ```cpp class MyTcp : public QObject { Q_OBJECT public: explicit MyTcp(QObject *parent = nullptr); signals: void messageReceived(const QString& message); public slots: void connectToHost(const QString& ip, quint16 port); void sendMessage(const QString& message); void disconnectFromHost(); private: QTcpSocket* m_tcpSocket; }; ``` 2. 实现MyTcp类的构造函数和槽函数。 ```cpp MyTcp::MyTcp(QObject *parent) : QObject(parent) { m_tcpSocket = new QTcpSocket(this); connect(m_tcpSocket, &QTcpSocket::readyRead, this, [this]() { QByteArray bytes = m_tcpSocket->readAll(); QString message = QString::fromUtf8(bytes.constData(), bytes.length()); emit messageReceived(message); }); connect(m_tcpSocket, &QTcpSocket::disconnected, this, []() { qDebug() << "Disconnected from server"; }); } void MyTcp::connectToHost(const QString& ip, quint16 port) { m_tcpSocket->connectToHost(ip, port); } void MyTcp::sendMessage(const QString& message) { m_tcpSocket->write(message.toUtf8()); } void MyTcp::disconnectFromHost() { m_tcpSocket->disconnectFromHost(); } ``` 3. 在GUI线程中创建一个实例对象,并与MyTcp类的信号和槽进行连接。 ```cpp MyTcp* tcp = new MyTcp(); connect(tcp, &MyTcp::messageReceived, this, [this](const QString& message) { ui->textEdit->append(message); }); tcp->connectToHost("127.0.0.1", 1234); tcp->sendMessage("Hello, world!"); ``` 4. 在另一个线程中使用MyTcp类进行TCP通信。 ```cpp void TcpWorker::run() { MyTcp tcp; connect(&tcp, &MyTcp::messageReceived, this, [this](const QString& message) { qDebug() << message; }); tcp.connectToHost("127.0.0.1", 1234); tcp.sendMessage("Hello, world!"); exec(); //等待事件循环结束 } ``` 以上就是一个简单的Qt多线程实现TCP通信的例子。需要注意的是,在GUI线程和工作线程之间进行通信时,应当使用Qt的信号和槽机制,以避免线程安全问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值