Qt 撤消/重做和线程

Qt undo/redo and threads

本文关键字:线程 重做 撤消 Qt      更新时间:2023-10-16

在我的MDI应用程序中,我使用Qt撤消/重做框架,它运行良好。

现在我已经实现了一个需要大量时间的操作,所以我想在另一个线程中运行它,以便应用程序不会冻结,用户可以同时在其他 MDI 窗口上工作。

所以我必须在QUndoCommandredo()方法内的新线程中运行该操作。这是一个问题,因为:

  1. 如果我在线程完成的redo()方法中等待,应用程序会冻结,因此毫无用处。
  2. 如果我不等待线程完成,redo()方法会在操作完成之前返回,这可能会导致很多问题和错误(例如,如果用户使用撤消/重做机制,则线程命令后面的命令可能会在完成之前执行(。

知道吗?

您遇到的问题比撤消/重做要大得多。更改体系结构,以便在进行异步数据处理时系统行为是合理的。数据管理器对象应指示何时繁忙,UI 应反映这一点。一旦你让它正常工作,撤消/重做也会神奇地工作。