qtthreadtest.h
#ifndef QTTHREADTEST_H
#define QTTHREADTEST_H
#include <QtWidgets/QWidget>
#include "ui_qtthreadtest.h"
#include <QThread>
class ThreadWorker;
class QtThreadTest : public QWidget
{
Q_OBJECT
public:
QtThreadTest(QWidget *parent = 0);
~QtThreadTest();
signals:
void SigStartThread();
private:
Ui::QtThreadTestClass ui;
ThreadWorker *m_pWordWorker;
QThread m_thread;
};
#endif // QTTHREADTEST_H
qtthreadtest.cpp
#include "qtthreadtest.h"
#include "ThreadWorker.h"
QtThreadTest::QtThreadTest(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
//工作線程
m_pWordWorker = new ThreadWorker();
connect(this, &QtThreadTest::SigStartThread, m_pWordWorker, &ThreadWorker::DoWork);
m_pWordWorker->moveToThread(&m_thread);
m_thread.start();
//啟動(dòng)線程執(zhí)行任務(wù)--放在其他槽函數(shù)中婆翔,比如某個(gè)按鈕點(diǎn)擊之后執(zhí)行
//設(shè)置線程需要使用的數(shù)據(jù)。甚带。。
m_pWordWorker->SetRunning();
emit SigStartThread();
while (m_pWordWorker->IsRunning())
{
QApplication::processEvents();
}
//任務(wù)完成后蹂匹、主線程處理數(shù)據(jù)等操作
}
QtThreadTest::~QtThreadTest()
{
//釋放線程資源
m_thread.quit();
m_thread.wait();
m_thread.deleteLater();
}
ThreadWorker.h
#pragma once
#include <QObject>
class ThreadWorker : public QObject
{
Q_OBJECT
public:
ThreadWorker(QObject *parent = nullptr);
~ThreadWorker();
bool IsRunning() { return m_bRunning; }
void SetRunning() { m_bRunning = true; }
public slots:
void DoWork();
private:
bool m_bRunning;//線程運(yùn)行標(biāo)志
//線程需要使用的其他數(shù)據(jù)定義,例如文件路徑,數(shù)據(jù)庫(kù)表名,http請(qǐng)求url等
};
ThreadWorker.cpp
#include "ThreadWorker.h"
ThreadWorker::ThreadWorker(QObject *parent)
: QObject(parent)
{
m_bRunning = false;
}
ThreadWorker::~ThreadWorker()
{
}
void ThreadWorker::DoWork()
{
m_bRunning = true;
//do somethings
m_bRunning = false;
}