【问题标题】:Qt undo/redo and threadsQt 撤消/重做和线程
【发布时间】:2018-05-31 07:53:51
【问题描述】:

在我的 MDI 应用程序中,我使用 Qt undo/redo 框架,它运行良好。

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

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

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

有什么想法吗?

【问题讨论】:

  • 可能您需要在工作线程运行时选择性地禁用某些 UI 命令。顺便说一句,这也适用于常规命令,不仅由 Undo-Redo 框架执行。
  • 如果命令需要很长时间,并且您不想禁用部分 UI - 您可以向用户显示带有“进度”的模式窗口。类似于执行这个繁重的命令时 - 进度可见吗?界面是否被锁定?
  • @hauron 现在我在主线程中运行该操作并显示一个模态进度对话框。这样用户必须等待操作完成,不能在其他 MDI 窗口上工作
  • @AlexF 你是对的,我必须在命令运行时禁用部分 UI,但我无法控制一切。例如QUndoView 允许用户通过单击重做更多命令,这可能会导致订单问题

标签: c++ multithreading qt undo-redo


【解决方案1】:

你有比撤销/重做更大的问题。更改架构,以便在进行异步数据处理时系统行为正常。数据管理器对象应该指示它何时忙碌,并且 UI 应该反映这一点。一旦你让它正常工作,撤消/重做也会神奇地工作。

【讨论】:

  • 如果这么“简单”,我没问! Qt undo/redo 框架中有一些我无法控制的机制。例如,在某些情况下,Qt 可以依次调用更多命令的 redo() 方法(它希望当 redo 方法返回时,操作完成)
  • 再次重申:只要代码的其余部分运行不正常,Qt 和撤消/重做的机制就不会发挥作用。
猜你喜欢
  • 2012-04-05
  • 1970-01-01
  • 2021-03-05
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 2020-01-08
  • 2012-06-22
相关资源
最近更新 更多