使用move to thread接口将某个类移动到新线程时,该类中如果有指针成员变量的话,也要把指针成员变量一起移动到新线程内,不然指针的成员变量还在主线程,特别的tcp、tdp等比较耗时的对象。
先移动类的对象,再移动类的指针成员变量。
类指针的初始化在移动到新线程前做就可以。
自己写了一个测试udp发送接收的类。用socket助手向发送数据,用自己的程序接收。来测试udp在多线程下的表现。
this->init();
this->moveToThread(&m_thread);
this->m_receiveSocket->moveToThread(&m_thread);
m_thread.start();
这段代码在一个类的构造函数里面,类中函数udp的socekt指针。
如果不把m_receiveSocket也移动到新线程。就会出现下面的错误:

并且udp只能收到一次数据,其余的全部就收不到了。
移动到新线程后,就是这样的结果。

数据接收正常。下面贴上完整源码。
udpReceiveTest .h:
#pragma once
#include <QObject>
#include <qudpsocket.h>
#include <qthread.h>
class udpReceiveTest : public QObject
{
Q_OBJECT
public:
QThread m_thread;
public

本文介绍了一种使用Qt框架实现UDP多线程通信的方法。通过将UDP接收类及其内部的socket指针移动到单独的线程中,解决了主线程与新线程间的数据接收问题。若不正确移动socket指针,则会导致数据接收不完整的情况。
最低0.47元/天 解锁文章
4698

被折叠的 条评论
为什么被折叠?



