c++ - Qt 异步 Action 序列

标签 c++ qt asynchronous design-patterns

在 C++/Qt 程序中,我需要按顺序运行一些带有“完成”信号的异步任务(例如网络下载、QProcess 等),每个任务都在最后一个完成之后。

我能想到的唯一方法是为每个步骤都有一个单独的状态类(非常冗长,就像在同步程序中为每一行都有一个单独的类),或者有一个带有状态枚举和字段的大类保存不同步骤所需的所有可能对象(不灵活,难以维护)。有什么好的解决方案吗?这似乎应该是一个常见问题,但我找不到任何问题。

最佳答案

命令模式

The only ways I can think of are to have a separate state class for each step (extremely verbose)

其实这种做法并没有错。它叫做command pattern ,并为其设计隐含地为每个操作创建一个单独的类。

您可以使用 QRunnableQQueue实现它。

  • QRunnable 是一个可运行对象。你从它继承你的类并重新实现 run()将执行单个异步作业(例如,下载文件)的方法。
  • QQueue 是一个实现“先进先出”( FIFO ) 的简单容器。您可以使用适合您需要的任何其他容器——QListQStack 等。

一般实现

在您的可运行对象中创建一个 done() 信号,并在其 run() 方法结束时发出它。要查询新任务,只需将新的 QRunnable 对象推送到容器并将 done() 信号连接到某个插槽,该插槽将 dequeue并运行单个任务。

如果底层类(不同于QProcessQNetworkManager 等)在设计上不是异步的,则可以使用QtConcurrent::run() 实现异步运行。 .

另见

您还可以将 QRunnableQThreadPool 一起使用并手动设置并发任务的限制。 Here您可以阅读有关 Qt 多线程技术的更多信息。

关于c++ - Qt 异步 Action 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37903585/

相关文章:

c++ - 如何在 Windows 上停止 boost::ioservice

c++ - 如何在Qdialogbox的linedits中填充值?

qt - 删除QLineEdit的边框

java - 在我关闭应用程序并再次打开之前,数据不会添加到 Firebase 上

ios - 为什么异步网络测试在 Objective-C/Swift 中很困难?

c++ - 异步tcp套接字和发送数据时的进度

c++ - 如何转发声明一个类的成员函数以在另一个类中使用?

c++ - 从 5x10^8 个不同的数组元素中读取,每次 4 个字节

c++ - 旋转图像会导致 Qt 失真

c++ - 为什么在没有明显代码的情况下删除对象?