掷骰子的多线程应用程序1(复现《Qt C++6.0》)

说明:复现的代码来自《Qt C++6.0》P496-P500。在复现时完全按照代码,出现了两处报错:

(1)ui指针(2)按钮的响应函数。下面程序对以上问题进行了修改。除了图片、清空、关闭功能外,其他功能实现复现。


主线程:

.h文件

#pragma once

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

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

private:
    QtClass* threadA;

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 do_threadA_newValue(int seq, int diceValue);
    void on_actThread_Run_clicked();
    void on_actDice_Run_clicked();
    void on_actThread_Quit_clicked();
    void on_actDict_Pause_clicked();
};

.cpp文件

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


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);
    connect(threadA, &QtClass::newValue, this, &ThreadTest_one::do_threadA_newValue);
}

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::do_threadA_newValue(int seq, int diceValue) {//与线程的newValue()信号相关联
    QString str = QString::asprintf("第%d次投骰子,点数为%d", seq, diceValue);
   
    ui.plainTextEdit->appendPlainText(str);
 
}

//按键的槽函数
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();
    ui.actDice_Run->setEnabled(false);
    ui.actDict_Pause->setEnabled(true);
}
void ThreadTest_one::on_actDict_Pause_clicked() {
    threadA->dicePause();
    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>

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;//停止线程

protected:
	void run();//线程的任务

public:
	void diceBegin();//开始掷骰子
	void dicePause();//暂停投骰子
	void stopThread();//停止线程

signals:
	void newValue(int seq, int diceValue);//产生新点数的信号

};

.cpp文件

#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) {
			m_diceValue = QRandomGenerator::global()->bounded(1, 7);
			m_seq++;
			emit newValue(m_seq, m_diceValue);
		}
		msleep(500);
	}
	quit();//退出线程
}
QtClass::~QtClass()
{}
相关推荐
小gpt&8 小时前
实现qt拖拽显示或者播放
数据库·qt·音视频
不烦下雨c13 小时前
[Qt从入门到精通] 信号和槽
开发语言·数据库·qt
cs82198483113 小时前
QT 设置高DIP支持多分屏幕,window缩放比例问题等
开发语言·qt·依赖倒置原则
qq7621182217 小时前
arm Rk1126 编译Qt工程报错: Could not find qmake spec
arm开发·qt
IT199519 小时前
Qt笔记-获取HTTP的POST请求提交的数据时需要注意的地方(2024-09-02)
笔记·qt·http
重生之我是数学王子21 小时前
QT简易项目 数据库可视化界面 数据库编程SQLITE QT5.12.3环境 C++实现
数据库·c++·qt
WALL-EC1 天前
VS2019+QT5.12 创建UI(Dialog窗体)界面自动生成.h和cpp文件
开发语言·qt·ui
沥川同学1 天前
跨平台应用开发框架(1)----Qt(组件篇)
c++·qt·udp·线程·tcp·qt5·qt6.3
人才程序员1 天前
详解Qt QStorageInfo 存储信息类
c语言·开发语言·c++·后端·qt·界面
机器视觉知识推荐、就业指导1 天前
基于Qt/C++/Opencv实现的一个视频中二维码解析软件
c++·qt·opencv