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

多线程中使用showmesage函数的有关问题

2012-04-18 
多线程中使用showmesage函数的问题多线程中使用showmesag函数结果弹出巨大的对话框连边界都找不到使用appl

多线程中使用showmesage函数的问题
多线程中使用showmesag函数
结果弹出巨大的对话框
连边界都找不到

使用application.msgbox就没事
啥原因啊

[解决办法]
ShowMessage弹出的对话框是VCL的自建窗口,Application.MessageBox弹出的窗口则是调用了Windows API弹出的。VCL的窗口是非线程安全的,所以,在多线程中创建和访问VCL窗口,是比较麻烦并且需要谨慎的。
[解决办法]

探讨
ShowMessage弹出的对话框是VCL的自建窗口,Application.MessageBox弹出的窗口则是调用了Windows API弹出的。VCL的窗口是非线程安全的,所以,在多线程中创建和访问VCL窗口,是比较麻烦并且需要谨慎的。

[解决办法]
同意楼上2位。
[解决办法]
学习一下

[解决办法]
可以用同步,弹出信息
[解决办法]
关注中..........
[解决办法]
貌似主要是Canvas没锁定。
试验:
把系统的Dialogs.pas拷出到程序所在目录,然后把它添加到工程。
修改CreateMessageDialog的代码:
在第一句Result := TMessageForm.CreateNew(Application);下加上
Result.Canvas.Lock;
在函数最后加上Result.Canvas.UnLock;

这样改后,ShowMessage在线程中就正常显示了吧!

我测试IDE为delphi 2007
[解决办法]
2楼说的对,ShowMessage是VCL窗体。
不能在线程中直接对它操作,而是应该用下面2种办法:
1.线程SendMessage或PostMessage给主线程,主线程来进行操作
2.用线程中的Synchronize过程来操作。注意Synchronize过程是一个没有参数的procedure
[解决办法]
个人觉得方便的话还是API MessageBox,这个是线程安全的
[解决办法]
Delphi(Pascal) code
procedure TTest.UpdateDLG;begin  ShowMessage('Dialog From a thread');end;procedure TTest.Execute;begin  Synchronize(UpdateDLG);end;
[解决办法]
继续学习中

[解决办法]
最好是在子线程中用消息把要显示的内容发到主线程,主线程再显示,这样最安全

热点排行