Skip to content
Snippets Groups Projects
Commit 5c48d421 authored by Wuttke, Joachim's avatar Wuttke, Joachim
Browse files

split onFinished...

parent 6be1b002
No related branches found
No related tags found
1 merge request!2342finish decoupling of JobsSet and JobWorker
......@@ -439,7 +439,7 @@ void JobItem::updateFileName()
item->setFileName(GUI::Path::intensityDataFileName(batchInfo()->jobName(), "refdata"));
}
JobWorker* JobItem::initWorker()
void JobItem::initWorker()
{
ISimulation* simulation =
GUI::ToCore::itemsToSimulation(*sampleItem(), *instrumentItem(), *simulationOptionsItem())
......@@ -451,11 +451,10 @@ JobWorker* JobItem::initWorker()
connect(worker(), &JobWorker::started, this, &JobItem::onStartedJob);
connect(worker(), &JobWorker::progressUpdate, this, &JobItem::onItemProgress);
connect(worker(), &JobWorker::finished, this, &JobItem::onFinishedWork);
connect(thread(), &QThread::started, worker(), &JobWorker::start);
connect(thread(), &QThread::finished, this, &JobItem::onFinishedThread);
return worker();
}
void JobItem::haltWorker()
......@@ -480,6 +479,33 @@ void JobItem::onItemProgress()
emit progressIncremented();
}
void JobItem::onFinishedWork()
{
batchInfo()->setEndTime(worker()->simulationEnd());
// propagate status of runner
if (isFailed(worker()->workerStatus()))
batchInfo()->setComments(worker()->workerFailureMessage());
else {
ASSERT(worker()->workerResult());
setResults(*worker()->workerResult());
}
batchInfo()->setStatus(worker()->workerStatus());
// fix job progress (if job was successfull, but due to wrong estimation, progress not 100%)
if (isCompleted(batchInfo()->status()))
batchInfo()->setProgress(100);
// tell the thread to exit here (instead of connecting JobRunner::finished
// to the QThread::quit because of strange behaviour)
ASSERT(thread());
thread()->quit();
emit jobFinished(this);
worker()->disconnect();
}
void JobItem::onFinishedThread()
{
m_thread->deleteLater();
......
......@@ -70,12 +70,12 @@ public:
//... simulation options
const SimulationOptionsItem* simulationOptionsItem() const
{
return m_simulation_options_item.get();
}
{
return m_simulation_options_item.get();
}
//... simulate
JobWorker* initWorker();
void initWorker();
void haltWorker();
JobWorker* worker() { return m_worker.get(); }
const JobWorker* worker() const { return m_worker.get(); }
......@@ -116,11 +116,13 @@ public:
signals:
void jobSelected(JobItem* item);
void jobFinished(JobItem* job_item);
void progressIncremented();
private slots:
void onStartedJob();
void onItemProgress();
void onFinishedWork();
void onFinishedThread();
private:
......
......@@ -181,11 +181,10 @@ void JobsSet::runJob(JobItem* job_item)
return;
connect(job_item, &JobItem::progressIncremented, this, &JobsSet::onProgressUpdate);
connect(job_item, &JobItem::jobSelected, this, &JobsSet::jobSelected);
connect(job_item, &JobItem::jobFinished, this, &JobsSet::onFinishedJob);
JobWorker* worker;
try {
worker = job_item->initWorker();
job_item->initWorker();
} catch (const std::exception& ex) {
QString message("JobsSet::runJob -> Error. "
"Attempt to create sample/instrument object from user description "
......@@ -200,9 +199,6 @@ void JobsSet::runJob(JobItem* job_item)
auto* thread = job_item->thread();
// finished job will do all cleanup
connect(worker, &JobWorker::finished, this, &JobsSet::onFinishedJob);
thread->start();
}
......@@ -211,39 +207,10 @@ void JobsSet::runJob(JobItem* job_item)
// ------------------------------------------------------------------------------------------------
//! Performs necessary actions when job is finished.
void JobsSet::onFinishedJob()
void JobsSet::onFinishedJob(JobItem* job_item)
{
auto* worker = qobject_cast<JobWorker*>(sender());
auto* job_item = jobItemForIdentifier(worker->workerIdentifier());
job_item->batchInfo()->setEndTime(worker->simulationEnd());
// propagating status of runner
if (isFailed(worker->workerStatus()))
job_item->batchInfo()->setComments(worker->workerFailureMessage());
else {
ASSERT(worker->workerResult());
job_item->setResults(*worker->workerResult());
}
job_item->batchInfo()->setStatus(worker->workerStatus());
// fixing job progress (if job was successfull, but due to wrong estimation, progress not 100%)
if (isCompleted(job_item->batchInfo()->status()))
job_item->batchInfo()->setProgress(100);
// I tell to the thread to exit here (instead of connecting JobRunner::finished
// to the QThread::quit because of strange behaviour)
ASSERT(job_item->thread());
job_item->thread()->quit();
onProgressUpdate();
emit jobSelected(job_item);
// assign for deletion
worker->disconnect();
emit globalProgress(100); // TODO don't if there are no simulations?
}
//! Estimates global progress from the progress of multiple running jobs and emits signal.
......
......@@ -69,7 +69,7 @@ signals:
void jobAdded();
private slots:
void onFinishedJob();
void onFinishedJob(JobItem* job_item);
void onProgressUpdate();
void onCancelAllJobs();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment