Delphi - 应用程序在ShowMessage或MessageDlg时挂起

时间:2014-11-03 16:00:29

标签: multithreading delphi appearance

为什么应用程序在执行线程时挂起,并且该线程具有ShowMessage或MessageDlg 但是当使用MessageBox时,一切正常。

如果应用程序外观不是defualt,那么所有这些都发生了>> “的视窗

如果选中的外观“ Windows ”,即使使用ShowMessage和MessageDlg也不会挂起

1 个答案:

答案 0 :(得分:3)

ShowMessage()MessageDlg()不是线程安全的。它们显示VCL表单,这些表单只能在主UI线程的上下文中使用。

Windows.MessageBox()通常是线程安全的,如果在从工作线程调用它时指定nil所有者窗口。它创建并显示自己的对话窗口,并在调用线程的上下文中运行自己的模态消息循环,因此通常没有线程问题。但是有一些问题(参见这篇文章:MessageBoxes and worker threads)。

TApplication.MessageBox()在内部调用Windows.MessageBox(),但不是线程安全的,因为它调用不是线程安全的RTL和MainForm,因此只应在main的上下文中使用UI线程也是如此。

简而言之,不要在工作线程中使用VCL弹出消息 - 期间。使用Windows.MessageBox(),或者为安全起见,将弹出消息委托给主UI线程。