在 C++/Qt 程序中,我需要按顺序运行一些带有“完成”信号的异步任务(例如网络下载、QProcess
等),每个任务都在最后一个完成之后。
我能想到的唯一方法是为每个步骤都有一个单独的状态类(非常冗长,就像在同步程序中为每一行都有一个单独的类),或者有一个带有状态枚举和字段的大类保存不同步骤所需的所有可能对象(不灵活,难以维护)。有什么好的解决方案吗?这似乎应该是一个常见问题,但我找不到任何问题。
最佳答案
命令模式
The only ways I can think of are to have a separate state class for each step (extremely verbose)
其实这种做法并没有错。它叫做command pattern ,并为其设计隐含地为每个操作创建一个单独的类。
QRunnable
是一个可运行对象。你从它继承你的类并重新实现run()
将执行单个异步作业(例如,下载文件)的方法。QQueue
是一个实现“先进先出”( FIFO ) 的简单容器。您可以使用适合您需要的任何其他容器——QList
、QStack
等。
一般实现
在您的可运行对象中创建一个 done()
信号,并在其 run()
方法结束时发出它。要查询新任务,只需将新的 QRunnable
对象推送到容器并将 done()
信号连接到某个插槽,该插槽将 dequeue
并运行单个任务。
如果底层类(不同于QProcess
、QNetworkManager
等)在设计上不是异步的,则可以使用QtConcurrent::run()
实现异步运行。 .
另见
您还可以将 QRunnable
与 QThreadPool
一起使用并手动设置并发任务的限制。 Here您可以阅读有关 Qt 多线程技术的更多信息。
关于c++ - Qt 异步 Action 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37903585/