QT多线程与TCP

关于QT貌似不能在子线程发出connectToHost连接请求 发出去另一边貌似完全不接收

研究了很多 还是没找到问题,想了一个折中的方案

在主线程建立连接再给子线程去通信

void Widget::on_pushButton_clicked()
{
    QRegExp rxp("\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b");
    if(!rxp.exactMatch(ui->lineEdit->text()))
    {
        QMessageBox::information(this, tr("错误"), tr("ip地址错误"));
        return;
    }
    if(!flagSend)
    {
        m_client=new MySocket(ui->lineEdit->text());
        connect(m_client,SIGNAL(readyRead()),this,SLOT(recvData()));
        connect(m_client,SIGNAL(disconnected()),this,SLOT(slotDdisconnect()));
        flagSend=true;
    }
    else
    {
        emit amendIp(ui->lineEdit->text());
    }
}

void Widget::connectServer(QString ip)
{
    this->hide();
    receive_Thread=new ThreadReceive(ip);
    receive_Thread->start();
}

void Widget::slotDdisconnect()
{
    qDebug()<<"断开";
    m_client->flagConnect=false;
    delete m_client;
    m_client=new MySocket(ui->lineEdit->text());
    connect(m_client,SIGNAL(readyRead()),this,SLOT(recvData()));
    connect(m_client,SIGNAL(disconnected()),this,SLOT(slotDdisconnect()));
}

void Widget::recvData()
{
    QByteArray array= m_client->readAll();
    qDebug()<<QString(array);
    if(array.toStdString()=="连接成功")
    {
        qDebug()<<"发送套接字连接成功";
        connectServer(ui->lineEdit->text());
        send_Thread=new ThreadSend(ui->lineEdit->text());
        m_client->moveToThread(send_Thread);
        m_client->flagConnect=true;
        send_Thread->start();
    }
    if(array.toStdString()=="清晰")
        m_client->flagClarity=true;
    if(array.toStdString()=="模糊")
        m_client->flagClarity=false;
    if(array.toStdString()=="无播放窗口")
    {
        QMessageBox::information(nullptr, tr("错误"), tr("服务器连接已满无播放窗口"));
        send_Thread->quit();
        delete m_client;
    }
}
本文主要是QT学习遇到的bug的记录,希望有大佬可以指正
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值