【发布时间】:2018-05-31 07:53:51
【问题描述】:
在我的 MDI 应用程序中,我使用 Qt undo/redo 框架,它运行良好。
现在我已经实现了一个需要很多时间的操作,所以我想在另一个线程中运行它,这样应用程序就不会冻结,同时用户可以在其他 MDI 窗口上工作。
所以我必须在我的QUndoCommand 的redo() 方法内的一个新线程中运行该操作。这是一个问题,因为:
- 如果我在
redo()方法内等待线程已完成,应用程序将冻结,因此无用。 - 如果我不等待线程完成,
redo()方法会在操作完成之前返回,这会导致很多问题和错误(例如,如果用户使用 undo/redo 机制,它是线程命令后面的命令可能在它完成之前执行)。
有什么想法吗?
【问题讨论】:
-
可能您需要在工作线程运行时选择性地禁用某些 UI 命令。顺便说一句,这也适用于常规命令,不仅由 Undo-Redo 框架执行。
-
如果命令需要很长时间,并且您不想禁用部分 UI - 您可以向用户显示带有“进度”的模式窗口。类似于执行这个繁重的命令时 - 进度可见吗?界面是否被锁定?
-
@hauron 现在我在主线程中运行该操作并显示一个模态进度对话框。这样用户必须等待操作完成,不能在其他 MDI 窗口上工作
-
@AlexF 你是对的,我必须在命令运行时禁用部分 UI,但我无法控制一切。例如
QUndoView允许用户通过单击重做更多命令,这可能会导致订单问题
标签: c++ multithreading qt undo-redo