如何在多线程中将指针传递给子类 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

QTcpSockets 不能跨多个线程使用。只有他们的创建线程可以调用他们的方法。

互斥对象应该在所有线程之间共享。

如果要实现多线程之间的通信通道,建议是:

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 a QThread 和 ***.com/a/35056527/4149835

以上是关于如何在多线程中将指针传递给子类 Qthread的主要内容,如果未能解决你的问题,请参考以下文章

如何在pybind11中将共享指针列表传递给c++对象

在 C++ 中将指向基类的指针传递给派生类的成员函数

如何在 Qthread 中使用 QAndroidJniEnvironment 指针?

如何将“this”指针传递给 C++ WinAPI 线程?

Objective-C 在自定义方法中将 NSError 指针传递给 NSFileManager

没有指针,我可以在 Python 中将引用作为参数传递吗? [复制]