1

我在 linux 的主线程中创建了两个线程,但是如何在 QT 中创建它们?

我的 GUI 有两个按钮启动和停止。我希望当按下开始按钮时,主线程启动并启动两个线程 TX 和 RX。当按下停止按钮时,tx 线程停止,然后接收线程停止,然后主线程停止。

我需要从一个主线程创建两个线程(TX/RX)。请建议如何完成我的代码。

  1. 我是否必须为 tx/rx 线程创建单独的对象,然后将这些对象移动到各自的 Qthread m_preceiveThread、m_pwriteThread?
  2. 另外应该在哪一点创建 tx & rx 线程(我应该在主线程对象的构造函数中创建它们)?
  3. 按下按钮时应该使用什么逻辑来停止线程(大多数情况下我们使用设置一个标志来控制线程工作功能)?
  4. 当dowork()函数结束时,线程会终止吗?
  5. 我已经在对象内部创建了两个 Qthread QThread m_preceiveThread;& ,它是拥有我将从我的主线程开始的线程的正确位置吗?QThread m_pwriteThread;deviceThreadObject

6.也在将movetothread函数应用到我的主线程之前。我是否必须在主线程对象的构造函数中deviceThreadObject m_deviceThreadObject; 或在线程启动时触发的 slot() 中准备 tx 和 rx 线程。

创建线程:

QThread m_deviceThread;
deviceThreadObject m_deviceThreadObject;
connect(&m_deviceThread,SIGNAL(started()),m_deviceThreadObject,SLOT(dowork()));
m_deviceThreadObject.moveToThread(&m_deviceThread);

Tx/Rx 线程对象:

/// forward declarations
class deviceThreadObject;

// transmit & receive thread object
class txRxThreadObject : public QObject
{
    Q_OBJECT
public:
    explicit txRxThreadObject(QObject *parent = 0);

    deviceThreadObject *m_pMainThreadObj;

    /* Termination control  thread*/
    bool m_bQuitRx;
    bool m_bQuitTx;

signals:

public slots:
    void dowork_tx();
    void dowork_rx();

};

主设备线程对象:

class deviceThreadObject : public QObject
{
    Q_OBJECT
public:
    explicit deviceThreadObject(QObject *parent = 0);

    QThread m_preceiveThread;
    QThread m_pwriteThread;

    bool m_bQuit;

    /// Pointer to QStandardItemModel to be used inside - canTableView
    QStandardItemModel *modeltable;

    /// pointer to the txRxThreadObject  object
    class txRxThreadObject *m_ptxRxThreadObject;

    /// setup function for device thread
    void dosetup(QThread &devThread);

signals:

public slots:
    void dowork()
    {     
       for(int i=0; i<100; i++)
       {
           qDebug() << "hello";    
       }    
    }


};
4

0 回答 0