Qt5多線程測試 附所有源代碼
1. 新建工程項目首先我們新建一個工程項目,可以按照平常的步驟進行創建。如果不清楚如何創建,請關注我并查看我的其他經驗。在創建項目時記得勾選上界面選項,因為我們將通過手動繪制窗口界面。主窗口名為Mai
1. 新建工程項目
首先我們新建一個工程項目,可以按照平常的步驟進行創建。如果不清楚如何創建,請關注我并查看我的其他經驗。在創建項目時記得勾選上界面選項,因為我們將通過手動繪制窗口界面。主窗口名為MainWidget。
2. 添加新文件
點擊項目名鼠標右鍵,選擇添加新文件選項。這里我們選擇創建一個C 類,并點擊下一步。
3. 創建TimeWork類
輸入類名為TimeWork,該類用于實現我們的定時器的邏輯功能。點擊完成即可,其他默認設置即可。
4. TimeWork頭文件
在TimeWork的頭文件中添加如下部分,記得加上Q_OBJECT宏,否則無法使用信號槽。
```cpp
include
class TimeWork : public QObject
{
Q_OBJECT
public:
explicit TimeWork(QObject *parent nullptr);
signals:
void timeChanged(int time);
public slots:
void run();
private:
int m_time;
};
```
5. TimeWork源文件
TimeWork的cpp文件,函數的實現如下圖所示。需要注意的是,QThread的run()函數是運行在子線程中的,其余函數均在主線程中運行。對于需要在多個線程中更改的變量,我們需要上鎖來保護變量更改時的線程調用唯一性。
```cpp
include "timework.h"
include
include
TimeWork::TimeWork(QObject *parent) : QObject(parent)
{
m_time 0;
}
void TimeWork::run()
{
while(true)
{
QThread::msleep(100); // 延時100ms
m_time ; // 每100ms時間加1
emit timeChanged(m_time); // 發送時間變化信號
qDebug() << "Time: " << m_time; // 打印時間
}
}
```
6. MainWidget主界面
MainWidget的實現方式如下圖所示。在該界面中,我們可以實現計時器的開始、暫停和停止功能。
```cpp
include "mainwidget.h"
include "ui_mainwidget.h"
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MainWidget)
, m_isRunning(false)
{
ui->setupUi(this);
m_timeWork new TimeWork(this); // 創建TimeWork實例
connect(m_timeWork, TimeWork::timeChanged, this, MainWidget::onTimeChanged); // 連接時間變化信號
}
MainWidget::~MainWidget()
{
delete ui;
}
void MainWidget::onTimeChanged(int time)
{
ui->labelTime->setText(QString::number(time)); // 更新顯示時間
}
void MainWidget::on_pushButtonStart_clicked()
{
if(!m_isRunning)
{
m_timeWork->moveToThread(m_thread); // 將TimeWork移動到子線程中
m_(); // 啟動子線程
m_timeWork->run(); // 運行TimeWork
m_isRunning true;
}
}
void MainWidget::on_pushButtonPause_clicked()
{
if(m_isRunning)
{
m_thread.quit(); // 退出子線程
m_thread.wait(); // 等待子線程結束
m_isRunning false;
}
}
void MainWidget::on_pushButtonStop_clicked()
{
if(m_isRunning)
{
m_thread.quit(); // 退出子線程
m_thread.wait(); // 等待子線程結束
m_isRunning false;
}
m_timeWork->deleteLater(); // 刪除TimeWork實例
m_timeWork new TimeWork(this); // 重新創建TimeWork實例
}
```
7. 程序運行效果
程序可以實現計時器的開始、暫停和停止功能,具體運行效果如下圖所示。
8. 查看源代碼
你可以在[GitHub]()上找到所有的程序源代碼。