2016 - 2024

感恩一路有你

Qt5多线程测试 附所有源代码

浏览量:3422 时间:2024-06-18 15:25:51 作者:采采

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]()上找到所有的程序源代码。

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。