【发布时间】:2019-12-20 07:04:14
【问题描述】:
我在 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对象。同样,这需要在课堂外使用QFutureWatchers 处理它们,这仍然非常庞大。 - 为每个方法创建一个单独的类。如果我没记错的话,这是一个命令模式。虽然这会大大增加课程的数量,但我相信这是最干净的解决方案。
在 Qt 中设计这种异步包装器的正确方法是什么?
【问题讨论】:
标签: c++ qt asynchronous design-patterns qfuture