diff --git a/GUI/Models/JobItem.cpp b/GUI/Models/JobItem.cpp index 3926272e4fc720ec2c53603f43d408cdd2d43b60..524c2d8083a5c430413844a0245a26d8c2726422 100644 --- a/GUI/Models/JobItem.cpp +++ b/GUI/Models/JobItem.cpp @@ -152,23 +152,34 @@ bool JobItem::isValidForFitting() return isTag(T_REALDATA) && getItem(T_REALDATA); } -void JobItem::setBeginTime(const QString& begin_time) +QDateTime JobItem::beginTime() const { - setItemValue(P_BEGIN_TIME, begin_time); + return QDateTime::fromString(getItemValue(P_BEGIN_TIME).toString(), Qt::ISODateWithMs); } -void JobItem::setEndTime(const QString& end_time) +void JobItem::setBeginTime(const QDateTime& begin_time) { - setItemValue(P_END_TIME, end_time); + setItemValue(P_BEGIN_TIME, begin_time.toString(Qt::ISODateWithMs)); } -// Sets duration (msec -> "sec.msec") -void JobItem::setDuration(int duration) +QDateTime JobItem::endTime() const { - QString str; - if (duration != 0) - str = QString("%7.3f").arg(duration / 1000.); - setItemValue(P_DURATION, str.simplified()); + return QDateTime::fromString(getItemValue(P_END_TIME).toString(), Qt::ISODateWithMs); +} + +void JobItem::setEndTime(const QDateTime& end_time) +{ + setItemValue(P_END_TIME, end_time.toString(Qt::ISODateWithMs)); + QString duration; + if (end_time.isValid()) { + QDateTime begin_time = beginTime(); + if (begin_time.isValid()) { + qint64 delta = begin_time.msecsTo(end_time); + if (delta >0) + duration = QString::number(delta / 1000., 'f', 3); + } + } + setItemValue(P_DURATION, duration); } QString JobItem::getComments() const diff --git a/GUI/Models/JobItem.h b/GUI/Models/JobItem.h index bad625a04c691eceb65b5a0482941b8b7bf09a2d..22506f34906e395e6ffb03139d496ee6ece1fd01 100644 --- a/GUI/Models/JobItem.h +++ b/GUI/Models/JobItem.h @@ -32,6 +32,8 @@ class RealDataItem; class ISimulation; class SimulationOptionsItem; +#include <QDateTime> + class BA_CORE_API_ JobItem : public SessionItem { private: @@ -80,11 +82,11 @@ public: bool isFailed() const; bool isValidForFitting(); - void setBeginTime(const QString& begin_time); - - void setEndTime(const QString& end_time); + QDateTime beginTime() const; + void setBeginTime(const QDateTime& begin_time); - void setDuration(int duration); + QDateTime endTime() const; + void setEndTime(const QDateTime& end_time); QString getComments() const; void setComments(const QString& comments); diff --git a/GUI/Models/JobQueueData.cpp b/GUI/Models/JobQueueData.cpp index e109cb9fda4ab3d3106d6c72b8f79d7d3800f4d3..7d2922faf82c5d6b0ae73f90cd32d7ecf344a4dc 100644 --- a/GUI/Models/JobQueueData.cpp +++ b/GUI/Models/JobQueueData.cpp @@ -107,8 +107,8 @@ void JobQueueData::onStartedJob() auto jobItem = m_jobModel->getJobItemForIdentifier(worker->identifier()); jobItem->setProgress(0); jobItem->setStatus("Running"); - jobItem->setBeginTime(GUI::Helpers::currentDateTime()); - jobItem->setEndTime(QString()); + jobItem->setBeginTime(worker->simulationStart()); + jobItem->setEndTime(QDateTime()); } //! Performs necessary actions when job is finished. @@ -223,8 +223,7 @@ void JobQueueData::clearSimulation(const QString& identifier) void JobQueueData::processFinishedJob(JobWorker* worker, JobItem* jobItem) { - jobItem->setEndTime(GUI::Helpers::currentDateTime()); - jobItem->setDuration(worker->simulationDuration()); + jobItem->setEndTime(worker->simulationEnd()); // propagating status of runner if (worker->status() == "Failed") { diff --git a/GUI/Models/JobWorker.cpp b/GUI/Models/JobWorker.cpp index 400f38f1e6e453e669cf9c52d0240a54bf867fa8..322e87c32ce673ae30aa02425fcd6114a90a635d 100644 --- a/GUI/Models/JobWorker.cpp +++ b/GUI/Models/JobWorker.cpp @@ -23,7 +23,6 @@ JobWorker::JobWorker(const QString& identifier, ISimulation* simulation) , m_percentage_done(0) , m_job_status("Idle") , m_terminate_request_flag(false) - , m_simulation_duration(0) { } @@ -40,7 +39,8 @@ int JobWorker::progress() const void JobWorker::start() { m_terminate_request_flag = false; - m_simulation_duration = 0; + m_simulation_start = QDateTime::currentDateTime(); + m_simulation_end = QDateTime(); emit started(); if (m_simulation) { @@ -51,14 +51,9 @@ void JobWorker::start() m_job_status = "Running"; try { - QDateTime beginTime = QDateTime::currentDateTime(); m_simulation->runSimulation(); if (m_job_status != "Canceled") m_job_status = "Completed"; - - QDateTime endTime = QDateTime::currentDateTime(); - m_simulation_duration = static_cast<int>(beginTime.msecsTo(endTime)); - } catch (const std::exception& ex) { m_job_status = "Failed"; m_percentage_done = 100; @@ -74,6 +69,7 @@ void JobWorker::start() m_failure_message = "JobRunner::start() -> Error. ISimulation doesn't exist."; } + m_simulation_end = QDateTime::currentDateTime(); emit progressUpdate(); emit finished(); } @@ -88,9 +84,14 @@ QString JobWorker::failureMessage() const return m_failure_message; } -int JobWorker::simulationDuration() const +const QDateTime& JobWorker::simulationStart() const +{ + return m_simulation_start; +} + +const QDateTime& JobWorker::simulationEnd() const { - return m_simulation_duration; + return m_simulation_end; } //! Sets request for JobRunner to terminate underlying domain simulation. diff --git a/GUI/Models/JobWorker.h b/GUI/Models/JobWorker.h index 0df779318915eaa580498fe3517e63428d173c52..2060d50f3aee6b5843e7112e984c759b21f3d88e 100644 --- a/GUI/Models/JobWorker.h +++ b/GUI/Models/JobWorker.h @@ -16,6 +16,7 @@ #define BORNAGAIN_GUI_MODELS_JOBWORKER_H #include <QObject> +#include <QDateTime> class ISimulation; @@ -34,7 +35,8 @@ public: QString failureMessage() const; - int simulationDuration() const; + const QDateTime& simulationStart() const; + const QDateTime& simulationEnd() const; signals: void started(); @@ -54,7 +56,8 @@ private: QString m_job_status; bool m_terminate_request_flag; QString m_failure_message; - int m_simulation_duration; + QDateTime m_simulation_start; + QDateTime m_simulation_end; }; #endif // BORNAGAIN_GUI_MODELS_JOBWORKER_H diff --git a/GUI/Views/FitWidgets/FitSessionController.cpp b/GUI/Views/FitWidgets/FitSessionController.cpp index 7590171e6eda5b80614a92085c29c6e9b579a064..136a04564633f56a7e09d20328a97b18ec15c6ae 100644 --- a/GUI/Views/FitWidgets/FitSessionController.cpp +++ b/GUI/Views/FitWidgets/FitSessionController.cpp @@ -123,9 +123,8 @@ void FitSessionController::onFittingStarted() m_jobItem->setStatus("Fitting"); m_jobItem->setProgress(0); - m_jobItem->setBeginTime(GUI::Helpers::currentDateTime()); - m_jobItem->setEndTime(QString()); - m_jobItem->setDuration(0); + m_jobItem->setBeginTime(m_runFitManager->fitStart()); + m_jobItem->setEndTime(QDateTime()); emit fittingStarted(); } @@ -134,9 +133,8 @@ void FitSessionController::onFittingFinished() { if (m_jobItem->getStatus() != "Failed") m_jobItem->setStatus("Completed"); - m_jobItem->setEndTime(GUI::Helpers::currentDateTime()); + m_jobItem->setEndTime(m_runFitManager->fitEnd()); m_jobItem->setProgress(100); - m_jobItem->setDuration(m_runFitManager->getDuration()); if (m_jobItem->isCompleted()) m_fitlog->append("Done", FitLogFlags::SUCCESS); @@ -150,6 +148,7 @@ void FitSessionController::onFittingError(const QString& text) message.append("Current settings cause fitting failure.\n\n"); message.append(text); m_fitlog->append(message.toStdString(), FitLogFlags::ERROR); + m_jobItem->setEndTime(m_runFitManager->fitEnd()); emit fittingError(message); } diff --git a/GUI/Views/FitWidgets/FitWorker.cpp b/GUI/Views/FitWidgets/FitWorker.cpp index f4fc67175042acdcbdb9f2db2df61e64064e39a8..6fe0d485431adbc80b5e62618054a47931ca10eb 100644 --- a/GUI/Views/FitWidgets/FitWorker.cpp +++ b/GUI/Views/FitWidgets/FitWorker.cpp @@ -18,19 +18,13 @@ void FitWorker::startFit() { - int duration(0); - QDateTime beginTime = QDateTime::currentDateTime(); - emit started(); try { m_fit_objective->runFit(); - duration = durationSince(beginTime); - } catch (const std::exception& ex) { - duration = durationSince(beginTime); emit error(QString::fromLatin1(ex.what())); } - emit finished(duration); + emit finished(); } void FitWorker::interruptFitting() @@ -38,9 +32,3 @@ void FitWorker::interruptFitting() if (m_fit_objective) m_fit_objective->interruptFitting(); } - -int FitWorker::durationSince(const QDateTime& since) -{ - QDateTime endTime = QDateTime::currentDateTime(); - return int(since.msecsTo(endTime)); -} diff --git a/GUI/Views/FitWidgets/FitWorker.h b/GUI/Views/FitWidgets/FitWorker.h index 871a320394e4dfb51bd5889af1be227f55dbb988..60184815a9bb608dddcfd040159f847c3c224e86 100644 --- a/GUI/Views/FitWidgets/FitWorker.h +++ b/GUI/Views/FitWidgets/FitWorker.h @@ -36,12 +36,11 @@ signals: void started(); - void finished(int duration); + void finished(); void error(const QString& message); private: - int durationSince(const class QDateTime& since); std::shared_ptr<FitObjectiveBuilder> m_fit_objective; }; diff --git a/GUI/Views/FitWidgets/FitWorkerLauncher.cpp b/GUI/Views/FitWidgets/FitWorkerLauncher.cpp index 31abed06d6e653ccd2bb1d33c99ea9f98d8438d5..6a528b55542e152bee05bf2e3d5c377e4bdfab54 100644 --- a/GUI/Views/FitWidgets/FitWorkerLauncher.cpp +++ b/GUI/Views/FitWidgets/FitWorkerLauncher.cpp @@ -17,7 +17,7 @@ #include <QThread> FitWorkerLauncher::FitWorkerLauncher(QObject* parent) - : QObject(parent), m_is_fit_running(false), m_duration(0) + : QObject(parent), m_is_fit_running(false) { } @@ -48,28 +48,33 @@ void FitWorkerLauncher::runFitting(std::shared_ptr<FitObjectiveBuilder> suite) thread->start(); } -//! Returns duration of fit in msec. +const QDateTime& FitWorkerLauncher::fitStart() const +{ + return m_fit_start; +} -int FitWorkerLauncher::getDuration() const +const QDateTime& FitWorkerLauncher::fitEnd() const { - return m_duration; + return m_fit_end; } void FitWorkerLauncher::interruptFitting() { if (m_is_fit_running) - emit intern_interruptFittingWorker(); + emit intern_interruptFittingWorker(QPrivateSignal()); } -void FitWorkerLauncher::intern_workerFinished(int duration) +void FitWorkerLauncher::intern_workerFinished() { m_is_fit_running = false; - m_duration = duration; + m_fit_end = QDateTime::currentDateTime(); emit fittingFinished(); } void FitWorkerLauncher::intern_workerStarted() { + m_fit_start = QDateTime::currentDateTime(); + m_fit_end = QDateTime(); emit fittingStarted(); } diff --git a/GUI/Views/FitWidgets/FitWorkerLauncher.h b/GUI/Views/FitWidgets/FitWorkerLauncher.h index 752f4df5cdf2b52f0d93777870ef9b74b234c029..336a022d750bbe7dbcfd16d7496c9d57581880f9 100644 --- a/GUI/Views/FitWidgets/FitWorkerLauncher.h +++ b/GUI/Views/FitWidgets/FitWorkerLauncher.h @@ -16,6 +16,7 @@ #define BORNAGAIN_GUI_VIEWS_FITWIDGETS_FITWORKERLAUNCHER_H #include <QObject> +#include <QDateTime> #include <atomic> #include <memory> @@ -29,7 +30,8 @@ public: void runFitting(std::shared_ptr<FitObjectiveBuilder> suite); - int getDuration() const; + const QDateTime& fitStart() const; + const QDateTime& fitEnd() const; public slots: void interruptFitting(); @@ -38,10 +40,11 @@ signals: void fittingStarted(); void fittingFinished(); void fittingError(const QString& message); - void intern_interruptFittingWorker(); + + void intern_interruptFittingWorker(QPrivateSignal); private slots: - void intern_workerFinished(int duration); + void intern_workerFinished(); void intern_workerStarted(); @@ -49,7 +52,8 @@ private slots: private: std::atomic<bool> m_is_fit_running; - int m_duration; + QDateTime m_fit_start; + QDateTime m_fit_end; }; #endif // BORNAGAIN_GUI_VIEWS_FITWIDGETS_FITWORKERLAUNCHER_H diff --git a/GUI/utils/Helpers.cpp b/GUI/utils/Helpers.cpp index a4f15acbdf3e6e6f529f674d7b6a6b27c4aa441c..5fd0a9496cfb22461909e243e7a37188528c40b1 100644 --- a/GUI/utils/Helpers.cpp +++ b/GUI/utils/Helpers.cpp @@ -120,12 +120,6 @@ QString baseName(const QString& fileName) return info.baseName(); } -QString currentDateTime() -{ - return QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss"); - ; -} - QVector<double> fromStdVector(const std::vector<double>& data) { QVector<double> result; diff --git a/GUI/utils/Helpers.h b/GUI/utils/Helpers.h index 9d6d0dd770dff8eead4a20e489297cdb12759546..abe651e20bcfa17f89811a251cee027bd6cfff7e 100644 --- a/GUI/utils/Helpers.h +++ b/GUI/utils/Helpers.h @@ -34,8 +34,6 @@ int versionCode(const QString& version); bool isVersionMatchMinimal(const QString& version, const QString& minimal_version); -QString currentDateTime(); - QStringList fromStdStrings(const std::vector<std::string>& container); QVector<double> fromStdVector(const std::vector<double>& data);