找回密码
 立即注册
  • QQ空间
  • 回复
  • 收藏

Qt线程中使用socket作为客户端通信(二)

admin 2019-3-11 14:18 964人围观 Qt相关

来源于微信公众号:Pou光明

Qt使用线程的方式有两种,一种是上次所说的继承QThread重新实现run()函数,在run()函数中一直循环处理;另一种则是继承QObject并使用moveToThread()函数将对象移到子线程中。由于继承QThread方式使用的并不规范,Qt官方强烈建议使用继承QObject的方式。

根据之前编写程序得到的结果,在相对复杂的UI设计中,如果socket通信放在住UI中,并且让服务器每间隔10ms发送数据,这样会影响UI的响应,所以应将socket接收数据部分放到线程中。由上次程序得出的结果,使用继承QThread的方式并不可行,所以这次使用继承QObject的形式。经测试得出,继承QObject该方式不会造成UI的卡顿。

下面直接贴段代码压压惊:

客户端.h部分:

#ifndef MYCLIENT_H

#define MYCLIENT_H

#include <QObject>

#include <QThread>

class QTcpSocket;

class MyClient : public QObject

{

    Q_OBJECT

public:

    explicit MyClient(QObject *parent = 0);

    bool connectServer();

    void writeMsgToServer(QString str);

signals:

public slots:

    void slot_readMsgFromServer();

private:

    QTcpSocket *mp_clsTcpSocket;

};

#endif // MYCLIENT_H

客户端.cpp部分:

#include "myclient.h"

#include <QTcpSocket>

MyClient::MyClient(QObject *parent) : QObject(parent)

{

    mp_clsTcpSocket = new QTcpSocket;

    connect(mp_clsTcpSocket, SIGNAL(readyRead()),        //Qt::QueuedConnection

            this, SLOT(slot_readMsgFromServer()));

}

bool MyClient::connectServer()

{

    mp_clsTcpSocket->connectToHost("192.168.18.77",2115);//Qt::BlockingQueuedConnection

    if (mp_clsTcpSocket->waitForConnected(1000))

    {

        qDebug() << "connect success !";

        return true;

    }else{

        qDebug() << "connect faild !";

        return false;

    }

}

void MyClient::writeMsgToServer(QString str)

{

    mp_clsTcpSocket->write(str.toLatin1());

}

void MyClient::slot_readMsgFromServer()

{

    QByteArray recMsg = mp_clsTcpSocket->readAll();

    qDebug() << "recMsg from Server:" << recMsg;

}

为测试,IP和port直接使用固定的。

UI部分简要程序:

MyClient *mp_clsClient;

QThread *mp_thread;

Widget构造函数部分:

mp_thread= new QThread;

mp_clsClient = new MyClient();

mp_clsClient->connectServer();

mp_clsClient->moveToThread(mp_thread);

StartThread按钮:

mp_thread->start();

Send按钮:

mp_clsClient->writeMsgToServer(ui->lineEdit->text().append("\n"));

结果如图:



服务器端:



以目前我的知识水平来讲,之前在Qt线程中使用socket的方法是不正确的。如果以后遇到新的解决方式,会重新更新!

如果觉得还阔以,请关注~~~




----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:Pou光明,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

2人点赞鲜花

握手

雷人

路过

鸡蛋

刚表态过的朋友 (2 人)

yafeilinux和他的朋友们微信公众号二维码

微信公众号

专注于Qt嵌入式Linux开发等。扫一扫立即关注。

Qt开源社区官方QQ群二维码

QQ交流群

欢迎加入QQ群大家庭,一起讨论学习!

我有话说......
  • KaoN 2019-3-14 11:32
    mp_clsClient->writeMsgToServer(ui->lineEdit->text().append("\n"));
    这个跨线程调用了。。这样不对吧。。