subsurface/core/configuredivecomputerthreads.h
Berthold Stoeger 8733828380 computer configuration: use value semantics for DeviceDetails
The memory managements for DeviceDetails was very sketchy.
First of all, sharing a pointer to a structure between threads
seems like a recipe for disaster. Secondly, the structure was
a QObject and when first generated included in the (silly)
Qt object tree, but when generated in the threads it was not.
Clearly, this leaks.

Instead, use value semantics and use local copies of the
structure. I didn't go full length and use std::move to
move the data, because this doesn't work through signals
(which are the wrong abstraction here, but OK) and secondly
I didn't have time to analyze whether the caller still
needs the data after passing it down to the worker thread.

To be able to pass an object through signals, the class
has to be registered in the Qt MetaType system. Super
ugly, but fine for now. Ultimately, this whole thing should
probably be replaced by futures, co-routines, or whatever.

Moreover, this removes the prefix from  number of "m_*"
function parameters. By convention, "m_" marks member
variables, which function parameters are not.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>

make DeviceDetails a metatype

So that we can pass it as value through the signal/slot system.
(squash with original commit)

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2024-03-24 17:53:19 +01:00

62 lines
1.4 KiB
C++

// SPDX-License-Identifier: GPL-2.0
#ifndef CONFIGUREDIVECOMPUTERTHREADS_H
#define CONFIGUREDIVECOMPUTERTHREADS_H
#include <QObject>
#include <QThread>
#include "libdivecomputer.h"
#include "devicedetails.h"
class DeviceThread : public QThread {
Q_OBJECT
public:
DeviceThread(QObject *parent, device_data_t *data);
virtual void run() = 0;
signals:
void error(QString err);
void progress(int value);
protected:
device_data_t *m_data;
void progressCB(int value);
static void event_cb(dc_device_t *device, dc_event_type_t event, const void *data, void *userdata);
};
class ReadSettingsThread : public DeviceThread {
Q_OBJECT
public:
ReadSettingsThread(QObject *parent, device_data_t *data);
void run();
signals:
void devicedetails(DeviceDetails newDeviceDetails);
};
class WriteSettingsThread : public DeviceThread {
Q_OBJECT
public:
WriteSettingsThread(QObject *parent, device_data_t *data);
void setDeviceDetails(const DeviceDetails &details);
void run();
private:
DeviceDetails m_deviceDetails;
};
class FirmwareUpdateThread : public DeviceThread {
Q_OBJECT
public:
FirmwareUpdateThread(QObject *parent, device_data_t *data, QString fileName, bool forceUpdate);
void run();
private:
QString m_fileName;
bool m_forceUpdate;
};
class ResetSettingsThread : public DeviceThread {
Q_OBJECT
public:
ResetSettingsThread(QObject *parent, device_data_t *data);
void run();
};
#endif // CONFIGUREDIVECOMPUTERTHREADS_H