qt子线程中建立的信号和槽却在主线程中执行槽函数

先看一种写法

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QObject>
#include <QThread>
#include<QTcpServer>
class MyThread : public QThread
{
    Q_OBJECT
public:
    MyThread(QObject*parent=nullptr);
    ~MyThread();
protected:
    void run() override;
public slots:
private:
    void handleNewConnection();
    void handleDisConnection();
    void handleReceiveData(QTcpSocket*socket);
    QTcpServer*server;
};

#endif // MYTHREAD_H

#include "mythread.h"
#include<QTcpSocket>
MyThread::MyThread(QObject*parent):QThread(parent){

}

MyThread::~MyThread()
{
    delete server;
}

void MyThread::run()
{
    qDebug()<<"子线程id:"<<QThread::currentThreadId();
    server=new QTcpServer;
    connect(server,&QTcpServer::newConnection,this,&MyThread::handleNewConnection);
    server->listen(QHostAddress::Any,9527);
    exec();
}

void MyThread::handleNewConnection()
{
    qDebug()<<"建立连接槽函数执行线程id:"<<QThread::currentThreadId();
    qDebug()<<"一个客户端建立连接..."<<endl;
    QTcpSocket*con=server->nextPendingConnection();
    connect(con,&QTcpSocket::readyRead,this,[this,con](){handleReceiveData(con);});
    connect(con,&QTcpSocket::disconnected,this,&MyThread::handleDisConnection);
}

void MyThread::handleDisConnection()
{
    qDebug()<<"断开连接槽函数执行线程id:"<<QThread::currentThreadId();
    qDebug()<<"一个客户端断开连接..."<<endl;
}

void MyThread::handleReceiveData(QTcpSocket*socket)
{
    qDebug()<<"接受数据槽函数执行线程id:"<<QThread::currentThreadId();
    qDebug()<<"接收到数据:"<<socket->readAll()<<endl;
}

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow),td(nullptr)
{
    ui->setupUi(this);
    qDebug()<<"主线程id:"<<QThread::currentThreadId();
    td.start();
}

MainWindow::~MainWindow()
{
    delete ui;
}

上面的运行之后处理新的连接和连接断开以及数据读取的槽函数都是在主线程中执行的

修改之后:

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QObject>
#include<QTcpServer>
class MyThread:public QObject
{
    Q_OBJECT
public:
    MyThread(QObject*parent=nullptr);
    ~MyThread();
    void run() ;
public slots:
private:
    void handleNewConnection();
    void handleDisConnection();
    void handleReceiveData(QTcpSocket*socket);
    QTcpServer*server;
};

#endif // MYTHREAD_H

#include "mythread.h"
#include<QTcpSocket>
#include<QThread>
MyThread::MyThread(QObject*parent):QObject(parent){

}

MyThread::~MyThread()
{
    delete server;
}

void MyThread::run()
{
    //qDebug()<<"子线程id:"<<QThread::currentThreadId();
    server=new QTcpServer;
    connect(server,&QTcpServer::newConnection,this,&MyThread::handleNewConnection);
    server->listen(QHostAddress::Any,9527);
}

void MyThread::handleNewConnection()
{
    qDebug()<<"建立连接槽函数执行线程id:"<<QThread::currentThreadId();
    qDebug()<<"一个客户端建立连接..."<<endl;
    QTcpSocket*con=server->nextPendingConnection();
    connect(con,&QTcpSocket::readyRead,this,[this,con](){handleReceiveData(con);});
    connect(con,&QTcpSocket::disconnected,this,&MyThread::handleDisConnection);
}

void MyThread::handleDisConnection()
{
    qDebug()<<"断开连接槽函数执行线程id:"<<QThread::currentThreadId();
    qDebug()<<"一个客户端断开连接..."<<endl;
}

void MyThread::handleReceiveData(QTcpSocket*socket)
{
    qDebug()<<"接受数据槽函数执行线程id:"<<QThread::currentThreadId();
    qDebug()<<"接收到数据:"<<socket->readAll()<<endl;
}

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include"mythread.h"
#include<QThread>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    QThread *sonThread;
    MyThread*td;
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    qDebug()<<"主线程id:"<<QThread::currentThreadId();
    td=new MyThread();
    sonThread=new QThread();
    td->moveToThread(sonThread);
    td->run();
    sonThread->start();
}

MainWindow::~MainWindow()
{
    delete ui;
    delete sonThread;
    delete td;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pp不会算法^v^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值