首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

怎么理解在多线程不能使用“在线程里不能用ShowMessage(),MessageDlg()这样的函数,用Windows的 API代替 ”

2012-03-22 
如何理解在多线程不能使用“在线程里不能用ShowMessage(),MessageDlg()这样的函数,用Windows的API代替 ”在

如何理解在多线程不能使用“在线程里不能用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过程,截获自定义消息。

热点排行