该线程如何处理?(10分)

  • 主题发起人 主题发起人 云飘飘
  • 开始时间 开始时间
大虾 指望你了,快点阿 不如现在把:)
要不改天请你吃饭
 
人家中午要吃饭啊.........人是铁,饭是刚.....^_^
 
去掉就没有异常了
问题是不去掉的话:
单步调试执行到messagedlg就没有异常
一run,异常就出来了
 
最好不要在线程中用messagedlg,因为这样可能会导致资源死锁。。怎么解决?
线程可以发个自定义的消息给主程序,当主程序接收到这个消息的时候,让他messagedlg.
 
比如:
TForm1= class(TForm)
...
protected
procedure WndProc(var message:Tmessage);override;
//过滤消息
...
end;

.....
const MessageID = WM_User + 100;
//自己定义的消息
implementation
.....
procedure TForm1.WndProc(var message:Tmessage);
begin

if Messages.Msg = MessageID then
messagedlg.....
else
Inherited;//否则正常处理..
end;

在子线程中.....postmessage(form1窗体句柄, MessageID ,0,0);
 
我是这样做的
全部用messagebox来做 ,结果没有再出现异常:)
但是,我不清楚
messagebox和 messagedlg showmessage有什么本质上的区别
是哪点区别导致了这一现象?
 
目前我还不能很好的解释这个问题......
但是我还是觉得最好象我上面说的那样,主线程接受到到消息时候显示信息。。
 
MessageBox是微软供的对话框,而Messagedlg、showmessage是Borland自己从TForm继承实现的。
 
to 云飘飘
你的对象可以增加一个事件,这个事件就是执行完成的事件。然后在事件中写MessageBox。
 
高手就是高手.........
(2004-04-03 18:33:22) 东兰梦舞
MessageBox是系统提供的,做得比较好。
(2004-04-03 18:39:37) 东兰梦舞
确定:
ShowMessage与MessageDlg的ShowModel写了Screen对象,不是线程安全的。
刘麻子 19:27:58
是否因为没有互斥访问?
东兰梦舞 19:31:33
当然。
 
另外 抄 《编程高手》 一书中的片段 送给你 :
线程与GOI的冲突:死机的真正原因
很多人使用线程的时候,都喜欢在线程内画图。如果在线程内画图,程序就很容易出错,而
且还是那种没有任何响应和提示的错误问题.
例如,一个复制文件的程序,这个程序由两个线程组成,一个是复制文件的线程,一个
是显示文件复制进度的线程。理论上这个程序没有什么问题。但是,这个程序有一个很大的
隐患,就是主程序也可能某一时刻要更新这个进度条,例如,进度窗口被其他窗口挡住后或
窗体,这个窗体就要刷新,这时,如果线程的那个部分也要刷新,操作系统也要刷新。这样,
三个部分都要刷新他,程序就很容易死锁(《操作系统》对死锁有明确定义)。。。。。。
有一条原则,即程序中的线程一概不直接操作现成部分中的GDI。他只要发个消息给主程序
,让主程序来绘制图形,就不会出现任何的问题。。。。。
发消息的方法就是用PostMessage的函数,但一定不能用SendMessage,因为用PostMessage
可以让主程序调度去绘图,而SendMessage会立即去绘图。。。。。
 
ok,让我来改正一个错误 ,俺大哥说 ‘而SendMessage会立即去绘图。。。。。’是错的!也可以用 SendMessage ..... 抱歉!
 
5555 , 再来更正! 我大哥说,整段话都有问题。。。。。哭
 
-------------------------------------------
进度窗口被其他窗口挡住后或
窗体,这个窗体就要刷新,这时,如果线程的那个部分也要刷新,操作系统也要刷新。这样,
三个部分都要刷新他,程序就很容易死锁
---------------------------------------------
真有三个部分要刷新吗?大家想想?
窗体还自己会刷新啊?这不是操作系统做的吗?呵呵
操作系统怎么知道刷新什么?还不是由应用程序来做吗?
我比较笨,就不知道怎么会有三个部分要刷新程序
我只知道,如果有多个线程同时更新GDI内容,可能是会发生冲突的
 
----------------------------------------------
发消息的方法就是用PostMessage的函数,但一定不能用SendMessage,因为用PostMessage
可以让主程序调度去绘图,而SendMessage会立即去绘图。。。。。
----------------------------------------------
SendMessage会立即去绘图?
天哪,这还是高手说的话啊!
Windows的消息对一个HWND来说,保证是串行的啊!
真的不能用SendMessage吗?
还是说,我还没入门?
 
大家请看这里 :
http://www.csdn.net/develop/Read_Article.asp?Id=22845
http://www.csdn.net/develop/Read_Article.asp?Id=22954
http://www.csdn.net/develop/Read_Article.asp?Id=23133
http://www.csdn.net/develop/Read_Article.asp?Id=23281
http://www.csdn.net/develop/Read_Article.asp?Id=24097
http://www.csdn.net/develop/Read_Article.asp?Id=23246
 
后退
顶部