直接重寫QThread是沒有問題的,但是重寫QThread這種方式不太靈活,對於重寫的Thread來講,只有run函數才會在新的線程中。對於重寫的QThread是可以帶出來對應的數據得,但是自己響應自己的槽函數的話,就不太靈活了,Qt的老版本代碼中甚至寫了這樣的代碼。
WorkerThread(QObject *parent = 0)
: QThread(parent)
{
moveToThread(this);
}這種寫法是非常不清真的。包括Qt的QThread介紹中,都不推薦這樣寫了。今天給大家介紹新的實現方式,這種實現方式相當靈活,可以任意的啟動,暫停之類的操作,都是通過Qt的信號槽來實現。我們先繼續實現上一個例子。這次使用新的實現方式。
重寫QObject,move到新的線程中。
這樣是QObject自己的消息循環放到了新的線程中,跨線程之間信號槽就隨隨便便的使用了。
上代碼
class WorkThread : public QObject
{
Q_OBJECT
public:
WorkThread(QObject* parent = nullptr);
~WorkThread();
public slots:
void start1();
void doWork();
signals:
void workFinished();
void workStart();
};
//cpp
WorkThread::WorkThread(QObject* parent) : QObject (parent)
{
}
WorkThread::~WorkThread()
{
}
void WorkThread::start1()
{
emit workStart();
doWork();
}
void WorkThread::doWork()
{
for (int i = 0; i < 1000; i++)
{
qDebug()<<i<<endl;
}
emit workFinished();
}然後上邏輯代碼
m_workerThread = new QThread();
WorkThread* worker = new WorkThread();
worker->moveToThread(m_workerThread);
//開始線程
connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::ThreadStart);
connect(m_workerThread, &QThread::started, worker, &WorkThread::start1);
//銷毀線程
connect(worker, &WorkThread::workFinished, worker, &WorkThread::deleteLater);
connect(worker, &WorkThread::destroyed, m_workerThread, &QThread::quit);
connect(m_workerThread, &QThread::finished, m_workerThread, &QThread::deleteLater);直接看connect,一個個解釋
線程啟動,Object中的work函數開始工作,輸出1-1000完美釋放了QThread的資源。
當然有人問你這樣的操作太複雜了,沒必要。其實對於簡單的邏輯來講,這樣確實沒必要。但是對於顆粒度控制來講,這種更有優勢,下一篇。我會針對這個代碼通過信號槽做一些控制的操作。
https://github.com/CryFeiFei/Qt_Teach/tree/master/Qt_Teach/Thread2[1]
Reference[1]https://github.com/CryFeiFei/Qt_Teach/tree/master/Qt_Teach/Thread2: https://github.com/CryFeiFei/Qt_Teach/tree/master/Qt_Teach/Thread2