掷骰子的多线程应用程序2基于互斥量的线程同步(复现《Qt C++6.0》)

这篇具有很好参考价值的文章主要介绍了掷骰子的多线程应用程序2基于互斥量的线程同步(复现《Qt C++6.0》)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

掷骰子的多线程应用程序2基于互斥量的线程同步(复现《Qt C++6.0》),Qt,qt,c++,开发语言

说明:在复现过程中出现两点问题(1)run()函数中对m_diceValued的赋值(2)do_timeOut()函数中没有对m_seq、m_diceValued进行定义。修改后的复现程序如下所示:

主线程:

.h

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_ThreadTest_one.h"
#include "QtClass.h"

class ThreadTest_one : public QMainWindow//主线程
{
    Q_OBJECT

private:
    QtClass* threadA;
    QTimer* timer;//新定义定时器

protected:
    void closeEvent(QCloseEvent* event);


public:
    ThreadTest_one(QWidget* parent = nullptr);
    ~ThreadTest_one();

private:
    Ui::ThreadTest_oneClass ui;

public slots:
    void do_threadA_started();
    void do_threadA_finished();
   
    void on_actThread_Run_clicked();
    void on_actDice_Run_clicked();
    void on_actThread_Quit_clicked();
    void on_actDict_Pause_clicked();
    void do_timeOut();//新增定时器槽函数

};

.cpp

#include "ThreadTest_one.h"
#include <QCloseEvent>
#include <QThread>
#include <QTimer>


ThreadTest_one::ThreadTest_one(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    threadA = new QtClass(this);//创建工作线程
    connect(threadA, &QtClass::started, this, &ThreadTest_one::do_threadA_started);
    connect(threadA, &QtClass::finished, this, &ThreadTest_one::do_threadA_finished);
    timer = new QTimer(this);
    timer->setInterval(200);
    connect(timer, &QTimer::timeout, this, &ThreadTest_one::do_timeOut);
    
}

void ThreadTest_one::do_timeOut() {
    int tmpSeq = 0, tmpValue = 1;
    int m_diceValue;
    static int m_seq = 0;
    bool valid = threadA->readValue(&tmpSeq, &tmpValue);//地址做实参,值会改变
    if (valid&&(tmpSeq!=m_seq&&tmpSeq!=0)) {
        m_seq = tmpSeq;
        m_diceValue = tmpValue;
        QString str = QString::asprintf("第%d次投骰子,点数为:%d",m_seq,m_diceValue);
        ui.plainTextEdit->appendPlainText(str);
    }
}

void ThreadTest_one::do_threadA_started() {
  ui.statusBar->showMessage("Thread状态:thread start");
  ui.actThread_Run->setEnabled(false);
  ui.actThread_Quit->setEnabled(true);
  ui.actDice_Run->setEnabled(true);

}
void ThreadTest_one::do_threadA_finished() {
    ui.statusBar->showMessage("Thread状态:thread finished");
    ui.actThread_Run->setEnabled(true);
    ui.actThread_Quit->setEnabled(false);
    ui.actDice_Run->setEnabled(false);
    ui.actDict_Pause->setEnabled(false);
}

//按键的槽函数
void ThreadTest_one::on_actThread_Run_clicked() {//要用clicked才能得到响应
    threadA->start();
}
void ThreadTest_one::on_actThread_Quit_clicked() {
    threadA->stopThread();
}
void ThreadTest_one::on_actDice_Run_clicked() {
    threadA->diceBegin();
    timer->start();
    ui.actDice_Run->setEnabled(false);
    ui.actDict_Pause->setEnabled(true);
}
void ThreadTest_one::on_actDict_Pause_clicked() {
    threadA->dicePause();
    timer->stop();
    ui.actThread_Run->setEnabled(true);
    ui.actDict_Pause->setEnabled(false);
}

//重定义事件处理函数,确保窗口关闭时线程被停止
void ThreadTest_one::closeEvent(QCloseEvent* event) {
    if (threadA->isRunning()) {
        threadA->terminate();
        threadA->wait();
    }
    event->accept();
}

ThreadTest_one::~ThreadTest_one()
{}

工作线程:

.h

#pragma once

#include <QThread>
#include <QMutex>

class QtClass  : public QThread
{
	Q_OBJECT

public:
	QtClass(QObject *parent);
	~QtClass();
private:
	int m_seq = 0;   //掷骰子次数的序号
	int m_diceValue;//骰子的点数
	bool m_paused = true;//暂停投骰子
	bool m_stop = false;//停止线程
	QMutex mutex;//基于互斥量的线程同步,定义一个互斥量

protected:
	void run();//线程的任务,线程的事件循环

public:
	void diceBegin();//开始掷骰子
	void dicePause();//暂停投骰子
	void stopThread();//停止线程
	bool readValue(int *seq, int *diceValue);//供主线程读取数据的函数

};

.cpp文章来源地址https://www.toymoban.com/news/detail-731770.html

#include "QtClass.h"
#include<QRandomGenerator>
#include<QThread>

QtClass::QtClass(QObject *parent)
	: QThread(parent)
{}
void QtClass::diceBegin() {//开始掷骰子
	m_paused = false;
}
void QtClass::dicePause() {//停止掷骰子
	m_paused = true;
}
void QtClass::stopThread() {//停止线程
	m_stop = true;
}
void QtClass::run() {//run函数处理事件循环
	m_stop = false;
	m_paused = true;
	m_seq = 0;
	while (!m_stop) {
		if (!m_paused) {
			mutex.lock();//锁定互斥量
			m_diceValue = 0;
			//for(int i=0;i<5;i++)
			m_diceValue = QRandomGenerator::global()->bounded(1, 7);
			//m_diceValue = m_diceValue / 5;
			m_seq++;
			mutex.unlock();//解锁互斥量
		}
		msleep(500);
	}
	quit();//退出线程
}
bool QtClass::readValue(int* seq, int* diceValue) {
	if (mutex.tryLock(100)) {
		*seq = m_seq;
		*diceValue = m_diceValue;

		mutex.unlock();
		return true;
	}
	else
		return false;
}

QtClass::~QtClass()
{}

到了这里,关于掷骰子的多线程应用程序2基于互斥量的线程同步(复现《Qt C++6.0》)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 性能比较 - Spring Boot 应用程序中的线程池与虚拟线程 (Project Loom)

            本文比较了 Spring Boot 应用程序中的不同请求处理方法:ThreadPool、WebFlux、协程和虚拟线程 (Project Loom)。         在本文中,我们将简要描述并粗略比较可在 Spring Boot 应用程序中使用的各种请求处理方法的性能。         高效的请求处理在开发高性能后端应

    2024年02月12日
    浏览(41)
  • QT踩坑之子线程不能操作UI,否则应用程序卡死

    QT易踩坑之在子线程中操作UI,造成应用程序卡死! 这里调用SDKGetMemberInfo()接口可能是个耗时操作,因此我们使用 QtConcurrent启动一个线程 来执行该函数,若返回值为0,则主界面弹出提示语\\\"Examples of briquette elves\\\"(如何弹出提示语就是另一个故事了,这里我们不过多关注,但重

    2024年02月06日
    浏览(91)
  • 计算机视觉---flask框架封装目标检测,应用线程提高程序运行效率

    1.前言 上一篇文章flask部署 目标检测算法中讲到可以将检测算法封装到flask框架中进行web端展示,但在实际应用中发现一些问题并进行了解决,在本文中进行补充。 2.利用线程,提高flask程序运行效率 flask web端访问时,每次都会从头加载程序,导致每次访问页面刷新率很低或

    2024年02月16日
    浏览(47)
  • javafx应用程序线程异常Exception in thread “JavaFx Application Thread“

    前几天用javafx做小桌面应用程序出现了一个问题: 反复检查,最终确定报错的原因是UI刷新频率过快导致的 javafx提供了Platform.runLater用于解决该问题:  总结:需要高频调用方法使用Platform.runLater

    2024年02月10日
    浏览(50)
  • 【Linux】多线程2——线程互斥与同步/多线程应用

    💭上文主要介绍了多线程之间的独立资源,本文将详细介绍多线程之间的 共享资源 存在的问题和解决方法。 intro 多线程共享进程地址空间,包括创建的全局变量、堆、动态库等。下面是基于全局变量实现的一个多线程抢票的demo。 发现错误:线程抢到负数编号的票,为什么

    2024年02月10日
    浏览(43)
  • 基于C#的画图应用程序(窗体应用程序)C#组件、控件

      使用VS2019,建立窗体应用程序,借助一系列控件实现画图功能。   结合组件与控件的使用。 目录 一、预备知识 1、什么是C#的组件和控件 (1)共同点 (2)不同点 二、主要步骤 1、软件以及环境 2、设置接口 3、界面设计 4、编写代码 5、编译程序和运行 三、编写代码 1、设

    2023年04月08日
    浏览(53)
  • 基于Qt HTTP应用程序项目案例

    main函数创建对象空间,确认窗口的大小和坐标。

    2024年02月07日
    浏览(39)
  • 基于aws构建一个web应用程序

    经验帖以及个人总结。 一. 在创建EC2主机前,可先行创建密匙以及安全组。 关于安全组: 1. 入站规则(别人访问你做的一些限制) :开放ssh 端口。是为了可以进行linux相关的连接。                                                                      开放http端口。

    2024年02月08日
    浏览(45)
  • 基于Vue前端框架构建BI应用程序

    Vue(Vue.js)是一个轻量级、高性能、可组件化的MVVM库。简而言之,是一个构建数据驱动的web界面的渐进式框架。它采用MVVM思想,通过数据双向绑定实现数据的动态渲染,同时也支持组件化的开发方式,使开发更加高效和可复用。 响应式编程: Vue会自动对页面中某些数据的变

    2024年02月10日
    浏览(52)
  • Qt下开发基于QGIS的应用程序

    由于有在背景地图上进行动态轨迹(曲线)显示的需要,故采用Qt+QGIS的方案! Qt5.12.12,VS2015编译器,QGIS3.10.1。 在配置之前,电脑是新装机的系统,没有任何相关软件版本。 在Qt官网(https://download.qt.io/)或国内镜像网站(https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt)或网络搜索

    2024年02月14日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包