6

このブログ、このブログ、およびその他のブログを読んで、QThread をサブクラス化することは悪い習慣です。そこで、この方法を応用してみました。

しかし、私の問題は、別のスレッドに移動したいクラスに QTimer と QTcpSocket があることです。突然、例で使用したほど簡単ではなくなりました。:(

QThread m_commsThread;
m_pICommsHandler = new CommsHandlerIP();
m_pICommsHandler->moveToThread(&m_commsThread);
m_commsThread.start();

そして、これが CommsHandlerIP クラスで、メソッドは含まれていません。

class CommsHandlerIP : public QObject
{
    Q_OBJECT
public:
    CommsHandlerIP();
    ~CommsHandlerIP(void);
protected:
    QTcpSocket m_TCPSocket;
    QTimer m_timer;
}

問題は、CommsHandlerIP を移動しても、QTimer と QTcpSocket (CommsHandlerIP クラス内) がメイン スレッドにあることです。そのため、タイマーを開始したり、ソケットを接続したりできません。

QTimer と QTcpSocket を moveToThread しようとすると (たとえば、スレッド ポインターを渡すことによってコンストラクター内で)、アプリを終了すると非常に面倒になります。

私は何をすべきか?

4

3 に答える 3

2

同じアルゴリズムに従いますが、 QRunnableQThreadPoolを使用して、スレッドの作成とスレッド アフィニティの変更に必要なすべてのボイラープレートを必要としない、これらすべてを達成するためのはるかに簡単な方法があります。

Merlin069 の例を変換すると、コードが少し単純化されていることがわかります。

class CommsHandlerIP : public QObject, public QRunnable
{
    Q_OBJECT
    public:
       void run();

    public slots:
        //... any slots

    signals:
        //... any signals

    private:
       // c++ 11, initialising in headers...
       QTimer* m_pTimer = NULL;
       QTcpSocket* m_pSocket = NULL;   
};

void CommsHandlerIP::run()
{
     m_pTimer = new QTimer();
     m_pSocket = new QTcpSocket();

     //...

     delete m_pTimer;
     delete m_pSocket;
}

QThreadPool::globalInstance()->start(new CommsHandlerIP);
于 2013-10-09T13:19:58.963 に答える