如何理解在多线程不能使用“在线程里不能用ShowMessage(),MessageDlg()这样的函数,用Windows的 API代替 ”
在一个多线程中,需要显示一个对话框。用MeessageDlg来显示。可是会出现如下错误:Canvas does not allow drawing。
在网上查找原因,找到了这篇帖子。
http://topic.csdn.net/t/20020410/16/636721.html
文中提到“在线程里不能用ShowMessage(),MessageDlg()这样的函数,用Windows的 API 函数 MessageBox() 代替就可以了。”
问题1、为什么?
还有http://topic.csdn.net/t/20040402/09/2916175.html一文中提到以下内容:
------------------------------------------------------
你最好用全局调用,否则你可能会有很多MessageBox的.
也就是Synchronize(ShowMsg);
然后在ShowMsg里面调用主窗体的ShowMsg这样就可以实现了.
void TThread::ShowMsg()
{
MainForm-> ShowMsg();
}
void TMainForm::ShowMsg()
{
ShowMessage( "OK ");
}
--------------------
问题:
2、解决Canvas does not allow drawing的错误是不是有两个方法①使用Application的MessageBox方法②使用Synchronize()+ShowMessage()或MessageDlg()。
3、使用Synchronize方法时,必须用全局调用吗?
4、例如Synchronize(ShowMsg); Synchronize方法不能带参数,很不方便,怎么办?
[解决办法]
你说的对,在多线程里面显示对话框就用你说的解决办法.因为vcl界面控件不是线程安全的,所以调用的时候会引起同时drawing的错误.你说的这个Synchronize调用必须全局调用就不理解你说得是什么意思了.这个方法没有参数,但是可以用全局变量来传递数据.
[解决办法]
ShowMessage和MessageDlg都是VCL中提供的消息框函数,多线程中操作VCL时,需要用同步方法Synchronize
子线程中给主线程发消息,用自定义消息就行了。
主窗体重载WndProc过程,截获自定义消息。