我在 Qt 中为外部可执行文件编写了一个包装类。它有很多方法,其中大多数:
- 很耗时。
- 需要返回不同类型的值。
在这种情况下,同步包装器非常简单:
class SyncWrapper {
public:
// Values are fetched *synchronously* in these methods
QString name() const;
QStringList files() const;
bool remove(const QString &file) const;
};
但是,我想让这个包装器异步,如下所示:
class AsyncWrapper {
Q_OBJECT
public:
// Values are fetched *asynchronously* in these methods
void name() const;
void files() const;
void remove(const QString &file) const;
signals:
// Values are returned via signals
void nameReady(const QString &name) const;
void filesReady(const QStringList &files) const;
void removeDone(bool success) const;
};
问题
我不确定这种模式是否可以,因为我有多个要点:
- 复制。假设有 100 种方法。这些方法中的每一种都需要一个专用信号。
- 比赛条件。如果我多次运行相同的方法,我无法知道我捕获的信号的顺序。
可能的解决方案
我提出的其他一些想法:
- 坚持同步包装器并
QtConcurrent::run
在调用类方法时使用。不幸的是,这是一个非常庞大的解决方案。 - 从方法返回
QFuture
对象。同样,这将需要QFutureWatcher
在仍然非常庞大的类之外使用 s 来处理它们。 - 为每个方法创建一个单独的类。如果我没记错的话,这是一个命令模式。虽然这会大大增加课程的数量,但我相信这是最干净的解决方案。
在 Qt 中设计这种异步包装器的正确方法是什么?