为什么应用程序在执行线程时挂起,并且该线程具有ShowMessage或MessageDlg 但是当使用MessageBox时,一切正常。
如果应用程序外观不是defualt,那么所有这些都发生了>> “的视窗”
如果选中的外观“ Windows ”,即使使用ShowMessage和MessageDlg也不会挂起
答案 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线程。