2012-09-02 24 views
2

我遇到了messagebox API的问题。 我使用messageboxw向用户提问。 例如,我的程序非常忙于线程等,当用户单击显示消息框的按钮时,它不会显示消息框,直到我的程序比以前不太忙。当我删除消息框后,代码执行正常。我有太多的代码可以显示,但也许有一些我必须照顾...Delphi中的Messagebox延迟

任何人都有过这种经历吗?

感谢您的帮助。

回答

10

单击按钮时发生的情况是消息被发送到消息队列。直到下一次抽取消息队列时才会处理该消息。因此,如果您在点击按钮和程序响应之间看到延迟,那是因为消息队列没有及时处理。

如果你的GUI线程繁忙,那么消息队列将不会被泵送,直到主线程完成它正在做的任何事情。如果你的GUI线程很长时间运行,你的GUI线程会很忙。一旦排队的按钮点击消息最终得到处理,则调用MessageBoxW将导致立即显示对话框。

GUI线程无法运行的唯一原因是,如果CPU被更高优先级的线程使用。但这不太可能。应用程序使用高优先级的线程是非常不寻常的。如果你这样做,我会感到惊讶。

如何解决问题?如果您的主线程上有长时间运行的任务,请将这些任务移至后台线程。或者,如果您有高优先级线程停止运行GUI线程,那么以正常优先级运行后台线程。

+0

它不在GUI线程中运行。就像我说的,当我删除消息框时它工作正常。我使用indy和繁忙的代码都在OnExecute过程中执行。 –

+3

什么不在你的GUI线程中运行?显然然后按钮是。如果没有立即处理按钮点击,则必须运行其他必须在其中运行的按钮,以免及时处理您的消息队列。 –

+0

就像我说的。如果我完全错过了这个消息箱,它就可以正常工作。 –