QT 多线程使用QTcpSocket

本人亲测使用moveToThread()的方式可以;不存在报错,警告
 
 
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    SocketThread *worker = new SocketThread;
    worker->moveToThread(&workerThread);
    connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
    connect(this, &Widget::operate, worker, &SocketThread::run1);
    connect(worker, &SocketThread::resultReady, this, &Widget::handleResults);
    workerThread.start();
    emit operate();
    qDebug()<<"main"<<QThread::currentThreadId();
}

Widget::~Widget()
{
    //t.exit();
    workerThread.quit();
    workerThread.wait();
    delete ui;
}

void Widget::handleResults(const QString &)
{

}


 

#ifndef WIDGET_H
#define WIDGET_H
 
#include <QWidget>
#include"socketthread.h"
#include<QThread>
namespace Ui {
class Widget;
}
 
class Widget : public QWidget
{
    Q_OBJECT
 
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
 
private:
    Ui::Widget *ui;
 
    QThread workerThread;
public slots:
    void handleResults(const QString &);
signals:
    void operate();
};
 
#endif // WIDGET_H
 

#include "socketthread.h"
#include"QDebug"
#include<QMessageBox>
#include<QThread>
SocketThread::SocketThread(QObject *parent) : QObject(parent)
{
     //start();
}
 
SocketThread::~SocketThread()
{
 
//    quit();
//    wait();
 
 
}
 
void SocketThread::OnNewConnection()
{
    qDebug()<<"new connection";
    socket_ptr = std::make_shared<QTcpSocket>();
    socket_ptr = static_cast<std::shared_ptr<QTcpSocket> >(server_ptr->nextPendingConnection());
    connect(socket_ptr.get(),QTcpSocket::readyRead,this,OnRead);
    socket_list->push_back(socket_ptr);
 
     qDebug()<<QThread::currentThreadId();
}
 
void SocketThread::OnRead()
{
    qDebug()<<"ready read";
    qDebug()<<QThread::currentThreadId();
    QByteArray arr;
    QTcpSocket *socket_ptr = static_cast<QTcpSocket*>(sender());
 
    arr = socket_ptr->readAll();
    socket_ptr->write(arr);
    qDebug()<<arr;
 
}
void SocketThread::run1()
{
 
    socket_list = new std::list<std::shared_ptr<QTcpSocket>>();
    server_ptr = std::make_shared<QTcpServer>();
    server_ptr->listen(QHostAddress::Any,5000);
    connect(server_ptr.get(),QTcpServer::newConnection,\
            this,SocketThread::OnNewConnection);
    qDebug()<<QThread::currentThreadId();
 
}
 
 



#ifndef SOCKETTHREAD_H
#define SOCKETTHREAD_H
 
#include <QObject>
#include <QTcpSocket>
#include<QTcpServer>
#include<memory>
#include<list>
class SocketThread : public QObject
{
    Q_OBJECT
public:
    explicit SocketThread(QObject *parent = 0);
    ~SocketThread();
signals:
 
public slots:
    void OnNewConnection();
    void OnRead();
public slots:
    void run1();
private:
    std::list<std::shared_ptr<QTcpSocket>> *socket_list;
    std::shared_ptr<QTcpSocket> socket_ptr;
    std::shared_ptr<QTcpServer> server_ptr;
signals:
    void resultReady(const QString &result);
};
 
#endif // SOCKETTHREAD_H
 


  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Car12

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

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

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

打赏作者

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

抵扣说明:

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

余额充值