Files
Jungfraujoch/viewer/JFJochProcessController.h
T
leonarski_fandClaude Opus 4.8 800ffecd20 process/viewer: command-line generator + JFJochProcessController (GUI engine)
Foundation for making processing a first-class GUI activity:

- process/JFJochProcessCommandLine: reconstruct the equivalent jfjoch_process / jfjoch_azint
  command line from a ProcessConfig + DiffractionExperiment + input path, for handing a job
  off to a cluster. Unit-tested (full + azint).
- viewer/JFJochProcessController: runs one JFJochProcess job off the GUI thread (its own private
  reader; HDF5 access is globally serialized so it is safe next to the interactive reader) and
  reports back via queued Qt signals (started/phaseChanged/progress/finished/failed). Cancel()
  forwards to JFJochProcess::Cancel(). Progress is throttled to ~200 updates per run.

The visible processing UI (jobs window + snapshot switcher + converged settings) builds on this.

Verified: tests/jfjoch_test [process]; jfjoch_viewer links and builds against JFJochProcess.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 14:26:48 +02:00

58 lines
2.0 KiB
C++

// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
// SPDX-License-Identifier: GPL-3.0-only
#pragma once
#include <QObject>
#include <QString>
#include <atomic>
#include <thread>
#include "../process/JFJochProcess.h"
#include "../common/DiffractionExperiment.h"
#include "../common/PixelMask.h"
Q_DECLARE_METATYPE(ProcessResult)
// Runs one JFJochProcess job off the GUI thread and reports back via queued Qt signals. The job
// opens its own private JFJochHDF5Reader on the file (HDF5 access is globally serialized, so this
// is safe alongside the interactive reader), so the viewer becomes a processing frontend without
// blocking the UI. Cancel() is forwarded to JFJochProcess::Cancel() (atomic) and works from any
// thread / at any point of the run.
class JFJochProcessController : public QObject, private JFJochProcessObserver {
Q_OBJECT
public:
explicit JFJochProcessController(QObject *parent = nullptr);
~JFJochProcessController() override;
bool running() const { return running_; }
public slots:
// Start a job over `file_path` with the given (fully configured) experiment + mask + config.
// Ignored if a job is already running.
void start(const QString &file_path, DiffractionExperiment experiment,
PixelMask pixel_mask, ProcessConfig config);
void cancel();
signals:
void started();
void phaseChanged(QString phase);
void progress(quint64 done, quint64 total);
void finished(ProcessResult result);
void failed(QString error);
private:
// JFJochProcessObserver - called from worker threads, forwarded as queued signals.
void OnPhase(const std::string &phase) override;
void OnProgress(uint64_t done, uint64_t total) override;
void run_(QString file_path, DiffractionExperiment experiment, PixelMask pixel_mask, ProcessConfig config);
void joinWorker_();
std::thread worker_;
std::atomic<JFJochProcess *> active_{nullptr};
std::atomic<bool> running_{false};
std::atomic<bool> cancel_pending_{false};
};