QT 多线程学习

1、定义一个MyThread类,让其继承QThread,然后重新实现QThread::run()。

    /*定义QThread子类*/
    #ifndef MYTHREAD_H
    #define MYTHREAD_H
    
    #include <QThread>
    
    class MyThread : public QThread
    {
        Q_OBJECT
    public:
        explicit MyThread(QObject *parent = 0);
        ~MyThread();
    protected:
        //QThread的虚函数
        //线程处理函数
        //不能直接调用,通过start()间接调用
        void run();
    signals:
        void isDone();  //处理完成信号
    };
    #endif // MYTHREAD_H
    
    /*使用代码*/
    MyThread myThread;
    myThread.start(); //run()函数将会在线程中被执行
    myThread.run(); //run()函数将不会在线程中被执行

 

2、新建一个线程继承自QObject的线程类,在外部调用其实例的moveToThread(QThread对象)函数,传入一个QThread对象(或QThread公有继承子类对象)的地址作为该函数的参数。然后通过QThread对象的start()函数启动线程,则此实例中的槽函数都在QThread对象线程中执行。

    QThread m_tcpThread; //创建QThread实例
    TcpServer* m_tcpServer = new TcpServer(); //继承自QObject的线程类实例化
    m_tcpServer->moveToThread(&m_tcpThread);//将m_tcpServer加入m_tcpThread线程中
    m_tcpThread.start(); //启动线程之后,m_tcpServer中的槽函数都将在线程中执行

 

3、使用C++的thread类对象调用成员函数。

    //不含有参数的函数调用
    std::thread parseThread(&Parser::_parseData, this); //类::独立线程的函数名,this指针
    parseThread.join(); //join()函数被调用后,调用它的线程会被block,直到线程的执行被完成。
    //含有参数的函数调用
    std::thread myThread(&Pack2System::_getUisystemById, this, 1);//类::独立线程的函数名,this指针,实际参数
    myThread.detach();//detach()函数被调用后,执行的线程从线程对象中被分离,已不再被一个线程对象所表达--这是两个独立的事情。

 

posted @ 2021-09-25 21:01  xianyongchao  阅读(75)  评论(0编辑  收藏  举报