【发布时间】:2012-09-14 12:50:47
【问题描述】:
我有一个应用程序,其中大多数操作都需要一些时间,我希望始终保持 GUI 响应。用户触发的任何动作的基本模式如下:
- 准备动作(在主线程中)
- 执行操作(在后台线程中,同时保持 gui 响应)
- 显示结果(在主线程中)
我尝试了几种方法来实现这一点,但从长远来看,它们都会导致问题(在某些情况下似乎是随机访问违规)。
- 准备动作,然后调用后台线程,在后台线程结束时,使用
Synchronize在主线程中调用OnFinish事件。 - 准备动作,然后调用后台线程,在后台线程结束时,使用
PostMessage通知 GUI 线程结果已准备就绪。 - 准备动作,然后调用后台线程,然后忙等待(同时调用
Application.ProcessMessages)直到后台线程完成,然后继续显示结果。
我想不出另一种选择,而且这些方法都不适合我。这样做的首选方法是什么?
【问题讨论】:
-
我已经多次使用选项 2 没有任何问题。您是否尝试过使用 MadExcept 之类的工具来找出您的 accvios 发生在哪里?
-
选项 1 和 2 基本上是一样的,而且效果很好。选项 3 是邪恶的。不要这样做。
-
PostMessage来自后台线程是通知 GUI 有关结果的正确方法。你没有说这种方法有什么问题。有一些框架可以让这更容易,比如OTL 和AsyncCalls。 -
在 XE2+ 中支持跨平台,还有相同的选项吗?
-
否 - API 不同 :( 那个 siad,并不意味着不能使用类似的整体设计方法。后来的 Delphi 版本有更好的内置线程和线程间通信,支持,也许到了可以使用的程度:)
标签: multithreading delphi asynchronous delphi-xe