如何在多线程中将指针传递给子类 Qthread
Posted
技术标签:
【中文标题】如何在多线程中将指针传递给子类 Qthread【英文标题】:how to pass pointer to a Subclassed Qthread,in Multithread 【发布时间】:2016-02-23 15:31:53 【问题描述】:我创建了一些这样的类:
class TcpClient: public QObject
public TcpClient()
QSocket *socket;
QMutex mutex;
void write()
QMutexLocker locker(&mutex);
socket->write();
class SubQthread :public QThread
public:
SubQthread(TcpClient *tcp)
//
m_tcp = tcp;
private:
TcpClient *m_tcp;
protected:
void run()
m_tcp->write();
class Widget:public QWidget
public:
Widget()
client = new TcpClient(this);
private:
TcpClient *client;
当我创建多个子 QThreads 时,我将指针 TcpClient* 传递给 QThread。这是一个好主意吗? 前提是我可以确保应用完成后 TcpClient* 会被删除。
【问题讨论】:
让多个线程通过同一个套接字进行通信通常是个坏主意,即使有锁定也是如此。你的用例是什么?为什么所有线程都需要使用同一个套接字? 每个线程不能有一个套接字和一个连接吗? 我认为这属于代码审查 【参考方案1】:您的代码中有多个问题需要解决。
Qt 框架中没有QSocket
类。我猜你正在使用QTcpSocket
。
QTcpSocket
s 不能跨多个线程使用。只有他们的创建线程可以调用他们的方法。
互斥对象应该在所有线程之间共享。
如果要实现多线程之间的通信通道,建议是:
QSharedMemory。 少量数据的信号/槽。 手动实现受互斥锁保护的共享变量。 事件循环。【讨论】:
【参考方案2】:QTcpSocket
对象(以及QObject
派生类的每个其他对象)都存在于创建它的线程中。如果您在主(GUI)线程中创建QTcpSocket
对象并希望它存在于另一个线程中,您应该使用QObject::moveToThread
方法:qt thread with movetothread。但正确的方法是只在工作线程中创建套接字,或者使用套接字描述符在必要的线程中创建:QAbstractSocket::setSocketDescriptor()
您应该确保从它所在的同一线程调用您的QTcpSocket
对象。为此,您可以使用带有Qt::QueuedConnection
的信号和插槽
【讨论】:
非常感谢!我明白了你的意思,同时,谢谢你忍受我糟糕的英语 @M.Joe,另见:what is the correct way to implement aQThread
和 ***.com/a/35056527/4149835以上是关于如何在多线程中将指针传递给子类 Qthread的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Qthread 中使用 QAndroidJniEnvironment 指针?