如何在多线程中将指针传递给Subclassed Qthread

时间:2016-02-23 15:31:54

标签: c++ multithreading qt

我创建了这样的类:

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;


}

当我创建多个子QThread时,我将指针TcpClient *传递给QThread。这是一个好主意吗? 在我可以确保在应用程序完成后删除TcpClient *的条件下。

2 个答案:

答案 0 :(得分:1)

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

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

  • QTcpSocket s不能跨多个线程使用。只有他们的创建线程才能调用他们的方法。

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

如果您想在多个线程之间实现通信通道,建议如下:

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

答案 1 :(得分:0)

  1. QTcpSocket对象(以及QObject派生类的每个其他对象)都存在于创建它的线程中。如果您在main(GUI)线程中创建QTcpSocket对象并希望它存在于另一个线程中,则应使用QObject::moveToThread方法:qt thread with movetothread。但正确的方法是在工作线程中创建套接字或使用套接字描述符在必要的线程中创建:QAbstractSocket::setSocketDescriptor()
  2. 您应该确保从它所在的同一个线程中调用QTcpSocket对象。为此,您可以使用Signals&有Qt::QueuedConnection
  3. 的老虎机