【问题标题】:how to pass pointer to a Subclassed Qthread,in Multithread如何在多线程中将指针传递给子类 Qthread
【发布时间】: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* 会被删除。

【问题讨论】:

  • 让多个线程通过同一个套接字进行通信通常是个坏主意,即使有锁定也是如此。你的用例是什么?为什么所有线程都需要使用同一个套接字? 每个线程不能有一个套接字和一个连接吗?
  • 我认为这属于代码审查

标签: c++ multithreading qt


【解决方案1】:

您的代码中有多个问题需要解决。

  • Qt 框架中没有QSocket 类。我猜你正在使用QTcpSocket

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

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

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

  • QSharedMemory
  • 少量数据的信号/槽。
  • 手动实现受互斥锁保护的共享变量。
  • 事件循环。

【讨论】:

    【解决方案2】:
    1. QTcpSocket 对象(以及QObject 派生类的每个其他对象)都存在于创建它的线程中。如果您在主(GUI)线程中创建QTcpSocket 对象并希望它存在于另一个线程中,您应该使用QObject::moveToThread 方法:qt thread with movetothread。但正确的方法是只在工作线程中创建套接字,或者使用套接字描述符在必要的线程中创建:QAbstractSocket::setSocketDescriptor()
    2. 您应该确保从它所在的同一线程调用您的QTcpSocket 对象。为此,您可以使用带有Qt::QueuedConnection 的信号和插槽

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 2018-02-06
    • 1970-01-01
    相关资源
    最近更新 更多