| Родител: Framework Subsystem | Architecture Overview |
Class: Daqster::QProcessManager
Inherits: QObject
Header: src/frame_work/base/src/process/QProcessManager.h
Source: src/frame_work/base/src/process/QProcessManager.cpp
Generic process manager за стартиране и управление на child processes. Предоставя базова функционалност за process lifecycle management.
enum ProcessEvent_t {
PROCESS_NA, // Not available
PROCESS_STARTED, // Process started
PROCESS_STOPPED // Process stopped
};
struct ProcessDescriptor_t {
QString Name; // Executable path/name
QStringList Arguments; // Command line arguments
QProcess::OpenMode Mode; // I/O mode
};
typedef uint32_t ProcessHandle_t; // Unique process identifier
explicit QProcessManager(QObject *parent = nullptr);
bool GetProcessDescriptor(const ProcessHandle_t& handle,
ProcessDescriptor_t& desc) const;
Връща descriptor за process по handle. Returns true ако process съществува.
virtual void StartProcess(const QString& name,
const QStringList& arguments,
QProcess::OpenMode mode = QProcess::ReadWrite);
Стартира нов process:
QProcess обектsetupProcessEnvironment() (virtual hook)ProcessEvent(handle, PROCESS_STARTED)Parameters:
name - Executable path или имеarguments - Command line argumentsmode - I/O mode (ReadWrite, ReadOnly, WriteOnly, Unbuffered)void KillAll();
Terminate-ва всички managed processes:
terminate() (10 sec timeout)kill()void ProcessEvent(const ProcessHandle_t& handle,
const ProcessEvent_t& event);
Emit-ва се при промяна на process state:
PROCESS_STARTED - Process започна успешноPROCESS_STOPPED - Process завърши (exit или kill)protected:
virtual void setupProcessEnvironment(QProcess* process,
const QString& name,
const QStringList& arguments);
Override точка за customization на process environment преди start.
Default implementation: Празна (no-op)
Example override:
void MyManager::setupProcessEnvironment(QProcess* proc,
const QString& name,
const QStringList& args) {
// Call base implementation (if needed)
QProcessManager::setupProcessEnvironment(proc, name, args);
// Add custom environment
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("MY_VAR", "value");
env.insert("PATH", "/custom/path:" + env.value("PATH"));
proc->setProcessEnvironment(env);
// Set working directory
proc->setWorkingDirectory("/custom/workdir");
}
Използва QMap<ProcessHandle_t, QProcess*> за tracking на активни процеси.
Auto-increment counter за уникални handles.
KillAll())Not thread-safe - трябва да се използва от Qt main thread (Qt event loop).
QProcessManager manager;
// Connect to events
connect(&manager, &QProcessManager::ProcessEvent,
[](ProcessHandle_t handle, ProcessEvent_t event) {
if (event == QProcessManager::PROCESS_STARTED) {
qDebug() << "Process" << handle << "started";
} else if (event == QProcessManager::PROCESS_STOPPED) {
qDebug() << "Process" << handle << "stopped";
}
});
// Start a process
QStringList args = {"-v", "--config", "app.conf"};
manager.StartProcess("/usr/bin/myapp", args);
// Later: kill all processes
manager.KillAll();
class MyProcessManager : public Daqster::QProcessManager {
Q_OBJECT
public:
explicit MyProcessManager(QObject* parent = nullptr)
: QProcessManager(parent) {}
protected:
void setupProcessEnvironment(QProcess* proc,
const QString& name,
const QStringList& args) override {
// Call base
QProcessManager::setupProcessEnvironment(proc, name, args);
// Customize environment
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("MY_APP_CONFIG", "/etc/myapp.conf");
proc->setProcessEnvironment(env);
}
};
Process errors се handle-ват чрез Qt signals:
connect(process, &QProcess::errorOccurred,
[](QProcess::ProcessError error) {
qWarning() << "Process error:" << error;
});
KillAll() или destructor