提供营销单页网站,在技校计算机网站建设,为什么有的网页打不开怎么解决,搜索引擎推广是什么意思在项目中经常需要等待#xff0c;我们模拟0-30的数#xff0c;假如我们其中5#xff0c; 25的数需要进行等待#xff0c;等待用户处理完自己事情后#xff0c;按下按钮继续#xff0c;找Qt的项目中有一个
QStateMachineqstatemmachine类提供了一个分层有限状态机。 QSta…在项目中经常需要等待我们模拟0-30的数假如我们其中5 25的数需要进行等待等待用户处理完自己事情后按下按钮继续找Qt的项目中有一个
QStateMachineqstatemmachine类提供了一个分层有限状态机。 QStateMachine基于Statecharts的概念和符号。qstatemmachine是状态机框架的一部分。 状态机管理一组状态从QAbstractState继承的类和这些状态之间的转换QAbstractTransition的后代这些状态和转换定义了一个状态图。一旦构建了状态图状态机就可以执行它。qstatemmachine的执行算法基于状态图XML SCXML算法。该框架的概述给出了几个状态图和构建它们的代码。 使用addState函数向状态机添加顶级状态。使用removeState函数删除状态。不鼓励在机器运行时删除状态。 在机器启动之前必须设置初始状态。初始状态是机器启动时进入的状态。然后可以启动状态机。当进入初始状态时就会发出started信号。 机器是事件驱动的并保持自己的事件循环。事件通过postEvent发送到机器。请注意这意味着它是异步执行的并且如果没有正在运行的事件循环它将无法进行。你通常不需要将事件直接发布到机器上因为Qt的转换例如QEventTransition和它的子类会处理这个。但是对于由事件触发的自定义转换postEvent很有用。 状态机处理事件并进行转换直到进入顶级最终状态然后状态机发出finished信号。您还可以显式地stop状态机。在这种情况下会发出stopped信号。 下面的代码片段显示了一个状态机当按钮被点击时状态机将完成
QPushButton button;QStateMachine machine;QState *s1 new QState();s1-assignProperty(button, text, Click me);QFinalState *s2 new QFinalState();s1-addTransition(button, SIGNAL(clicked()), s2);machine.addState(s1);machine.addState(s2);machine.setInitialState(s1);machine.start();
那么我们实现自己
Processor类
#ifndef PROCESSOR_H
#define PROCESSOR_H#include QObject
#include QStateMachine
#include QState
#include QFinalStateclass Processor : public QObject
{Q_OBJECT
public:explicit Processor(QObject *parent nullptr);void startProcessing();void resumeProcessing();signals:void progressUpdated(int value);void runSig();void paused();void finished();private:void processNextItem();bool isRunning() const;private:QStateMachine *m_machine;QState *m_runningState;QState *m_pausedState;QFinalState *m_finishedState;int m_currentIndex;
};#endif // PROCESSOR_H#include processor.h
#include QDebug
#include QTimer
#include QThreadProcessor::Processor(QObject *parent): QObject(parent),m_machine(new QStateMachine(this)),m_runningState(new QState(m_machine)),m_pausedState(new QState(m_machine)),m_finishedState(new QFinalState(m_machine)),m_currentIndex(0)
{// 配置运行状态connect(m_runningState, QState::entered, [this]() {qDebug() Entered running state;processNextItem();});// 配置暂停状态connect(m_pausedState, QState::entered, [this]() {qDebug() Entered paused state;});// 配置暂停状态
// connect(m_finishedState, QState::entered, [this]() {
// qDebug() Entered finished state;
// });// 配置状态转换m_runningState-addTransition(this, Processor::paused, m_pausedState);m_pausedState-addTransition(this, Processor::runSig, m_runningState);m_runningState-addTransition(this, Processor::finished, m_finishedState);// 配置状态机m_machine-setInitialState(m_runningState);}bool Processor::isRunning() const
{return m_machine-isRunning();
}void Processor::startProcessing()
{if (!m_machine-isRunning()) {qDebug() Starting processing...;m_machine-start();}
}void Processor::resumeProcessing()
{m_currentIndex;emit runSig();}void Processor::processNextItem()
{if (m_currentIndex 30) {emit finished();return;}emit progressUpdated(m_currentIndex);if (m_currentIndex 5 || m_currentIndex 25) {qDebug() --- Reached pause point ---;emit paused();}else { // 只有非暂停点时继续自动处理m_currentIndex;QThread::msleep(200); //模拟耗时操作processNextItem();}
}单例模式
#ifndef TASKPROCESSOR_H
#define TASKPROCESSOR_H#include QObject
#include QStateMachine
#include QState
#include QFinalState
#include QQueue
#include QMutex
#include functionalclass TaskProcessor : public QObject
{Q_OBJECT
public:// 单例接口保证全局唯一static TaskProcessor getInstance() {static TaskProcessor processor;return processor;}// 添加任务到队列void addTask(const std::functionvoid() task);// 开始处理任务队列void startProcessing();// 暂停任务处理例如等待外部事件void pauseProcessing();// 恢复任务处理void resumeProcessing();signals:// 任务状态信号可根据需求扩展void pausedSig();void resumeSig();void taskStarted();void taskFinished();void allTasksFinished();private:// 构造函数私有确保单例explicit TaskProcessor(QObject *parent nullptr);Q_DISABLE_COPY(TaskProcessor)// 内部处理任务队列的方法void processNextTask();// 任务队列及同步保护QQueuestd::functionvoid() m_taskQueue;QMutex m_mutex;// 状态机及状态QStateMachine *m_machine;QState *m_runningState;QState *m_pausedState;QFinalState *m_finishedState;
};#endif // TASKPROCESSOR_H#include processor.h
#include QDebug
#include QThreadTaskProcessor::TaskProcessor(QObject *parent): QObject(parent),m_machine(new QStateMachine(this)),m_runningState(new QState(m_machine)),m_pausedState(new QState(m_machine)),m_finishedState(new QFinalState(m_machine))
{// 配置运行状态进入运行状态时尝试处理下一个任务connect(m_runningState, QState::entered, this, [this]() {qDebug() Entered running state;processNextTask();});// 配置暂停状态仅做记录具体暂停逻辑可通过状态机外部控制connect(m_pausedState, QState::entered, this, [this]() {qDebug() Entered paused state;});// 状态切换配置暂停和恢复m_runningState-addTransition(this, SIGNAL(pausedSig()), m_pausedState);m_pausedState-addTransition(this, SIGNAL(resumeSig()), m_runningState);// 当任务全部处理完毕时切换到结束状态m_runningState-addTransition(this, SIGNAL(allTasksFinished()), m_finishedState);// 状态机初始状态设为运行状态m_machine-setInitialState(m_runningState);
}void TaskProcessor::addTask(const std::functionvoid() task)
{QMutexLocker locker(m_mutex);m_taskQueue.enqueue(task);
}void TaskProcessor::startProcessing()
{if (!m_machine-isRunning()) {qDebug() Starting Task Processing...;m_machine-start();}
}void TaskProcessor::pauseProcessing()
{// 可以发出信号通知状态机进入暂停状态qDebug() Requesting pause...;emit pausedSig(); // 此处 SIGNAL 与状态机转换绑定
}void TaskProcessor::resumeProcessing()
{// 发出信号恢复处理qDebug() Requesting resume...;emit resumeSig();processNextTask();
}void TaskProcessor::processNextTask()
{QMutexLocker locker(m_mutex);if (m_taskQueue.isEmpty()) {qDebug() All tasks finished.;emit allTasksFinished();return;}// 取出队列中的下一个任务std::functionvoid() task m_taskQueue.dequeue();// 在运行状态下开始任务发出任务开始信号emit taskStarted();qDebug() Processing a task...;// 这里可以在一个独立线程中运行任务避免阻塞状态机// 例如QThread::sleep() 或者使用 QtConcurrenttask();// 任务执行完成发出任务结束信号emit taskFinished();}