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()函数被调用后,执行的线程从线程对象中被分离,已不再被一个线程对象所表达--这是两个独立的事情。
坚持成就伟大