Jet_likemian 2022-03-23 13:46 采纳率: 0%
浏览 36

QT QSocketServer 多线程信号与槽不触发

问题遇到的现象和发生背景

我用QTcpServer通讯,代码全写窗体里就没问题, 但是我把TCP功能写在Worker类然后加入线程,可以连接但是 readyRead , error 信号都触发不了

问题相关代码,请勿粘贴截图
#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);

    g_tcpSocket = new QTcpSocket(this);
    connect(g_tcpSocket, &QTcpSocket::readyRead, [&]() {
        if (g_tcpSocket->isOpen()) //读取数据OK
        {
        }
        });
    connect(g_tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(sl_readerror(QAbstractSocket::SocketError)));
    g_tcpSocket->connectToHost("127.0.0.1", 9120);
    g_tcpSocket->waitForConnected(30000);

    isConnected = false;
    m_pthread = new QThread(this); //进程类
    m_pworker = new Worker(); //工作类
    m_pworker->moveToThread(m_pthread); //将工作类加入进程中.
    connect(m_pthread, &QThread::finished,m_pworker,&QObject::deleteLater);
    connect(this, SIGNAL(sg_dowork()), m_pworker, SLOT(sl_dowork()));
    connect(m_pworker, SIGNAL(sg_finish()), this, SLOT(sl_finish()));
    connect(m_pthread, SIGNAL(started()), m_pworker, SLOT(sl_dowork()));
    m_pthread->start();
}
Dialog::~Dialog()
{
    delete ui;
}
void Dialog::sl_finish()
{

}

void Dialog::sl_readerror(QAbstractSocket::SocketError)
{
    QMessageBox::information(this, "MSG", "Error");
}
#include "worker.h"

Worker::Worker(QObject* parent /*= NULL*/)
{
    m_tcpSocket = new QTcpSocket(this);
    connect(m_tcpSocket, SIGNAL(readyRead()), this, SLOT(sl_msgfromhost()));
    connect(m_tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(sl_readerror(QAbstractSocket::SocketError)));
}

Worker::~Worker()
{

}

void Worker::sl_dowork()
{
    while (true)
    {
        doConnect();
        QThread::msleep(5000);
    }
}
void Worker::sl_readerror(QAbstractSocket::SocketError)
{
    isConnected = false;
    m_tcpSocket->disconnectFromHost();
}
void Worker::doConnect()
{
    if (isConnected)
        return ;
    m_tcpSocket->connectToHost(g_Address, g_PORT);
    isConnected=m_tcpSocket->waitForConnected();//如
}
void Worker::sl_msgfromhost()
{
    if (m_tcpSocket->isOpen())
    {
    }
}
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

1条回答 默认 最新

  • 樱花の雨 2022-03-24 12:28
    关注

    while (true)
    {
    doConnect();
    QThread::msleep(5000);
    }
    这个会导致线程卡主了

    评论

报告相同问题?

问题事件

  • 创建了问题 3月23日

悬赏问题

  • ¥15 校内二手商品转让网站
  • ¥20 高德地图聚合图层MarkerCluster聚合多个点,但是ClusterData只有其中部分数据,原因应该是有经纬度重合的地方点,现在我想让ClusterData显示所有点的信息,如何实现?
  • ¥100 求Web版SPC控制图程序包调式
  • ¥20 指导如何跑通以下两个Github代码
  • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀
  • ¥15 C++为什么这个代码没报错运行不出来啊
  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请