【发布时间】:2015-06-03 07:35:14
【问题描述】:
在我们的软件中,我们存在异步执行事件的问题。有时一个函数会“闯入”另一个函数并产生各种奇怪的结果。
我在这里处理的是触发事件的用户输入和计时器。
问题在于,与其逐个执行与事件相关的代码,不如在 Delphi 为其提供一个窗口的第一时间完成:application.processmessages。这会产生问题,有时功能 A 的一半完成,然后功能 B “闯入”,完成,然后,功能 A 的后半部分完成。这可能会产生“令人惊讶”的结果。
有什么好的方法可以解决这个问题吗?
我尝试过的事情:
--
- 使用“忙碌标志”,这有一些起伏,主要是你所做的一切都必须知道它。
- 尽可能删除所有 application.processmessages。这有很好的结果。但我们依赖于一些第 3 方组件,我发现这些组件也会触发 application.processmessages。
接下来我正在考虑尝试构建某种“命令队列”,在其中我可以接收我的事件并以先进先出的方式触发它们。
除了从头开始重建我们所拥有的一切,还有其他/更好的方法来解决这些问题吗?
【问题讨论】:
-
停止调用 ProcessMessages
-
消除你所有的
ProcessMessages,并且不要从定时器事件处理程序中调用包含ProcessMessages的第三方组件。 -
你可以。别再叫了。
-
"Just stop call it" 可能会引入其他问题。所以我不认为这是解决所有问题的方法。用更合适的函数替换该调用。
-
@SebastianZ 那会是什么功能呢?显然,剥离对 ProcessMessages 的调用会产生后果。与他们打交道,工作就完成了。抽出消息队列并允许重新进入是一个杯子的游戏。