在 Delphi 应用程序中,我有哪些选项可以取消长列表的操作?

3
为了简化问题,我的Delphi XE应用程序包含负责根据某些条件生成文件的对象:一个对象可以生成文本文件,其他对象(从前者继承)可以生成XML或HTML文件等等...它们都有一个共同的祖先,但不运行在线程上!
我现在正在尝试添加一种方法,使用户在点击取消按钮时可以取消整个生成过程。问题是我没有做任何事情让它起作用。最基本的操作是在整个生成过程中添加大量的if user_canceled then halt_process,但我感觉这不是最优的解决方案。
我的问题是,是否有更聪明的方法来实现这一点?或者您对重构我的代码有什么建议,以便将来可以更好地集成此添加时添加更多的生成代码(因此需要进行取消测试)?

1
你需要添加取消检查。 - David Heffernan
在编程中,显式添加 if Cancelled then exit; 比使用异常更好。这会导致更可预测的运行时行为。 - Warren P
3
@Warren 不是这样的。那只允许你从顶级例程中取消操作。使用静默的EAbort异常是取消操作的方法。 - David Heffernan
2个回答

2

如果需要取消进程,您需要添加手动检查,因为没有办法取消它并使程序处于有效状态。编译器/程序只是不知道哪些操作在应用程序逻辑中是原子操作,哪些不是。

例如:

OpenFile(...);  //<- if program halts anywhere before CloseFile you have the file locked
...
CloseFile;

最优解决方案很大程度上取决于您现有的设计。在排队操作的简单情况下 A -> B -> C -> D,如果您将其包装到线程中并在操作之间添加 if Terminated then Exit;(当然,如果有临时对象,则需要适当释放),那么它就可以工作。


0

我相信实现取消的好方法是使用EAbort。只要你将文件打开和关闭包装在try finally中,引发EAbort(例如在单击按钮时)就可以很好地让你退出一长串操作。它不应该起作用,但确实有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接