从主线程-qthread中创建了两个线程

从主线程-qthread中创建了两个线程,qt,qthread,Qt,Qthread,我已经在linux的主线程中创建了两个线程,但是如何在QT中创建它们呢 我的GUI有两个启动和停止按钮。 我想,当启动按钮按下,然后一个主线程开始&它启动两个线程发送和接收。 当按下停止按钮时,tx线程停止,然后接收线程停止,然后主线程停止 我需要从一个主线程创建两个线程(TX/RX)。 请建议如何完成我的代码 我是否必须为tx/rx线程创建单独的对象,然后将这些对象移动到各自的Qthread m_precivethread、m_pwriteThread 还应该在哪个点创建tx和rx线程(我应该

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

我的GUI有两个启动和停止按钮。 我想,当启动按钮按下,然后一个主线程开始&它启动两个线程发送和接收。 当按下停止按钮时,tx线程停止,然后接收线程停止,然后主线程停止

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

  • 我是否必须为tx/rx线程创建单独的对象,然后将这些对象移动到各自的Qthread m_precivethread、m_pwriteThread
  • 还应该在哪个点创建tx和rx线程(我应该在主线程对象的构造函数中创建它们吗)
  • 当按下按钮时,应该使用什么逻辑来停止线程(主要是我们用来设置一个标志,使线程工作函数失去控制)
  • 当dowork()函数结束时,线程是否会终止
  • 我创建了两个Qthread
    Qthread m_precivethread&
    QThread m_pwriteThread
    deviceThreadObject
    对象中,是否有从主线程开始的线程
  • 6.同样在将
    movetothread
    函数应用于我的主线程之前。我是否必须在主线程对象
    deviceThreadObject m_deviceThreadObject的构造函数中准备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";    
           }    
        }
    
    
    };
    
    主设备线程对象:

    /// 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";    
           }    
        }
    
    
    };
    
    class deviceThreadObject:公共QObject
    {
    Q_对象
    公众:
    显式deviceThreadObject(QObject*parent=0);
    QThread m_前向线程;
    QThread m_pwriteThread;
    布尔穆布奎特;
    ///指向要在内部使用的QStandardItemModel的指针-canTableView
    QStandarItemModel*模型表;
    ///指向txRxThreadObject对象的指针
    类txRxThreadObject*m_ptxRxThreadObject;
    ///设备线程的设置函数
    void dosetup(QThread和devThread);
    信号:
    公众时段:
    无效销钉()
    {     
    
    对于(int i=0;ii)如果希望在另一个线程中执行
    doWork
    slot,则应调用
    pObj->moveToThread(pThread)
    。很难理解您的代码。您在哪里调用//创建线程?我已经演示了如何处理多线程服务器示例。一般来说,由于大多数此类任务中固有的数据共享,在单个连接上分离接收和传输线程可能是一种过早的悲观态度。很少有c接收端和传输端完全不相关的通信协议-仅此而已,您需要两个线程。谢谢,我将浏览此链接。