add,计划采集13:

优化逻辑
This commit is contained in:
tangchao0503
2026-06-16 15:31:06 +08:00
parent d9f1ed922b
commit fc3853c3ca
15 changed files with 626 additions and 223 deletions

View File

@ -5,6 +5,7 @@
#include <QFile>
#include <QTextStream>
#include <QDebug>
#include <algorithm>
// ==================== 公共接口实现 ====================
@ -88,9 +89,9 @@ QString TimedDataCollectionDataStructuresReaderWriter::taskStatusToString(TaskSt
TaskStatus TimedDataCollectionDataStructuresReaderWriter::stringToTaskStatus(const QString& str)
{
if (str == "Running") return TaskStatus::Running;
if (str == "Finished") return TaskStatus::Finished;
return TaskStatus::Waiting;
//if (str == "Running") return TaskStatus::Running;
//if (str == "Finished") return TaskStatus::Finished;
return TaskStatus::default;
}
QString TimedDataCollectionDataStructuresReaderWriter::subTaskTypeToString(SubTaskType type)
@ -135,8 +136,8 @@ QJsonObject TimedDataCollectionDataStructuresReaderWriter::subTaskToJson(const S
bool TimedDataCollectionDataStructuresReaderWriter::jsonToSubTask(const QJsonObject& json, SubTask& subTask)
{
subTask.type = stringToSubTaskType(json["type"].toString());
subTask.startTime = QDateTime::fromString(json["startTime"].toString(), Qt::ISODate);
subTask.endTime = QDateTime::fromString(json["endTime"].toString(), Qt::ISODate);
subTask.startTime = QDateTime::fromString(QString(), Qt::ISODate);
subTask.endTime = QDateTime::fromString(QString(), Qt::ISODate);
subTask.durationMinutes = json["durationMinutes"].toDouble();
subTask.estimatedDurationMinutes = json["estimatedDurationMinutes"].toDouble();
subTask.pathLineFilePath = json["pathLineFilePath"].toString();
@ -158,6 +159,7 @@ QJsonObject TimedDataCollectionDataStructuresReaderWriter::timedTaskToJson(const
obj["startTime"] = task.startTime.toString(Qt::ISODate);
obj["endTime"] = task.endTime.toString(Qt::ISODate);
obj["durationMinutes"] = task.durationMinutes;
obj["estimatedDurationMinutes"] = task.estimatedDurationMinutes;
obj["savePath"] = task.savePath;
obj["status"] = taskStatusToString(task.status);
obj["HalogenLampPreheatingTime_Minute"] = task.HalogenLampPreheatingTime_Minute;
@ -175,9 +177,10 @@ bool TimedDataCollectionDataStructuresReaderWriter::jsonToTimedTask(const QJsonO
{
task.id = json["id"].toInt();
task.scheduledTime = QDateTime::fromString(json["scheduledTime"].toString(), Qt::ISODate);
task.startTime = QDateTime::fromString(json["startTime"].toString(), Qt::ISODate);
task.endTime = QDateTime::fromString(json["endTime"].toString(), Qt::ISODate);
task.startTime = QDateTime::fromString(QString(), Qt::ISODate);
task.endTime = QDateTime::fromString(QString(), Qt::ISODate);
task.durationMinutes = json["durationMinutes"].toDouble();
task.estimatedDurationMinutes = json["estimatedDurationMinutes"].toDouble();
task.savePath = json["savePath"].toString();
task.status = stringToTaskStatus(json["status"].toString());
task.HalogenLampPreheatingTime_Minute = json["HalogenLampPreheatingTime_Minute"].toDouble();
@ -220,6 +223,10 @@ void TaskExecutor::execute(const TimedTask& task)
m_task = task;
m_task.startTime = QDateTime::currentDateTime();
m_task.status = TaskStatus::Running;
emit taskUpdated(m_task);
m_currentSubTaskIndex = 0;
m_isRunning = true;
@ -293,6 +300,7 @@ void TaskExecutor::onSequenceComplete(int status)
qDebug() << "TaskExecutor: subtask "<< m_currentSubTaskIndex<< " time consuming(Minutes): "<< subTask.durationMinutes;
emit subTaskFinished(m_currentSubTaskIndex, subTask.type, (status == 0));
emit taskUpdated(m_task);
}
//
@ -315,6 +323,8 @@ void TaskExecutor::onSequenceComplete(int status)
int nestSubTaskIndex = m_currentSubTaskIndex + 1;
if (nestSubTaskIndex >= m_task.subTasks.size())
{
emit switchD65LampSignal(0);
emit switchSlrSignal(0);
emit switchHalogenLampSignal(0);
return;
}
@ -501,24 +511,53 @@ void TaskScheduler::stop()
void TaskScheduler::checkTasks()
{
// 检查是否所有任务都不需要执行
bool allTasksDone = std::all_of(m_tasks.begin(), m_tasks.end(),
[](const TimedTask& task) {
return task.status != TaskStatus::Waiting;
});
if (allTasksDone)
{
std::cerr << "TaskScheduler::checkTasks没有任务等待执行停止调度器" << std::endl;
stop();
}
QDateTime now = QDateTime::currentDateTime();
for (auto& task : m_tasks) {
if (m_currentTaskId >= 0)//有任务正在执行
{
return;
}
for (auto& task : m_tasks)
{
if (task.status != TaskStatus::Waiting) continue;
// 超过计划时间1分钟以上,认为任务已过时,跳过
if (task.scheduledTime.addSecs(60) < now) {
// 超过计划时间threSecs,认为任务已过时,跳过
qint64 threSecs = 30;
if (task.scheduledTime.addSecs(threSecs) < now)
{
std::cerr << "TaskScheduler::checkTasks任务已过时跳过:" << task.id << std::endl;
task.status = TaskStatus::Finished;
task.status = TaskStatus::Timeout;
for (size_t i = 0; i < task.subTaskCount(); i++)
{
task.subTasks[i].status = TaskStatus::Timeout;
}
emit taskDataChanged(task);
continue;
}
if (task.scheduledTime > now) continue;
// 到达计划时间,启动任务
std::cerr << "TaskScheduler::checkTasks到达计划时间启动任务" << std::endl;
executeTask(task);
break; // 一次只执行一个任务
qint64 fireThreSecs = 5;
if (task.scheduledTime.addSecs(-1*fireThreSecs) < now && task.scheduledTime.addSecs(fireThreSecs) > now)// 到达计划时间,启动任务
{
std::cerr << "TaskScheduler::checkTasks到达计划时间启动任务" << std::endl;
executeTask(task);
break; // 一次只执行一个任务
}
}
}
@ -561,10 +600,10 @@ void TaskScheduler::executeTask(TimedTask& task)
{
qDebug() << "TaskScheduler: Executing task" << task.id;
updateTaskStatus(task.id, TaskStatus::Running);
//updateTaskStatus(task.id, TaskStatus::Running);
m_currentTaskId = task.id;
emit taskStarted(task.id);
//emit taskStarted(task.id);
// 创建任务执行器
m_currentExecutor = new TaskExecutor(this);