求助多线程结束问题 ( 积分: 100 )

  • 主题发起人 主题发起人 crasyProg
  • 开始时间 开始时间
C

crasyProg

Unregistered / Unconfirmed
GUEST, unregistred user!
我使用线程向导创建了一个线程类,在线程Destroy时我向主线程postmessage,可是主线程捕捉不到这个消息,这是怎么回事呢,而其他的postmessage没有问题啊!
 
我使用线程向导创建了一个线程类,在线程Destroy时我向主线程postmessage,可是主线程捕捉不到这个消息,这是怎么回事呢,而其他的postmessage没有问题啊!
 
你怎么做的?贴出代码来看看
 
postmessage 是 WIN消息
PostThreadMessage THREAD
 
大概是这样
Mythread.Units
destruct Mythread.destroy;
begin
postmessage(fom1.handle,wm_threadMsg,0,0);
inherit;
end;
主线程Unit1
const
wm_threadMsg=wm_message+100;
procedure wmthreadmsg(msg:Tmsg):messages;wm_threadMsg;
begin
..
application.p..
end;
 
各位高手帮帮忙撒,我很郁闷为什么其他postmessage发送的消息主窗体能够捕捉到,而那个destroy的postmessage没有捕捉到,难道线程没有结束?
 
用sendmessage行不行?
或者,你的线程根本就没释放
 
FreeOnTerminate是否设为True啦?如果为False,那么是否在主程序中有调用Thread.Free?如果都没有,那么线程对象不会自动调用析构函数Destroy。
 
FreeOnTerminate是设为true啦,我是让线程执行完毕后自动释放的.
我的本意是想当一个线程结束后,发送消息给主窗体,主窗体然后再创建一个线程,然而那个消息捕捉不到,就没法创建!纳闷死了.
 
是否线程没有执行完?在Destroy中设个断点或ShowMessage一下看看。不知道你的线程执行体的代码,只能是乱猜。
 
请把 postmessage 改为 SendMessage, 因为 PostMessage 提交后不等待返回,所以
有可能是线程继续执行下去, wm_threadMsg 在线程结束时被释放掉了.
 
我设置了断点,可是根本中断不到destroy那!
线程执行体的代码在我的电脑里,我现在手头上没有源码。
大概是这样的:
private
myControl:Tcontrol;//控件名称假设的
mythread.execute;
begin
myControl:=Tcontrol.create(nil);
...
myControl.OnSucess=myThreadSucess;
while not terminateddo
application.process;
end;
procedure myThreadSucess(sender:Tobject,..)
begin
...
postmessage(form1.handle,wm_thredMsg2,1,0);
end;
 
SendMessage我没有试过,wm_threadMsg 在线程结束时被释放掉了?什么意思?
高手们请在指点指点吧。
 
应该是你Execute里的问题,只有当Execute里的代码执行完成或你手动执行了MyThread.Terminate的方法才会触发Destroy事件
 
private
myControl:Tcontrol;//控件名称假设的
MyThread.Execute;
begin
try
myControl:=Tcontrol.create(nil);
... //myControl一些属性付值
myControl.timeout=1000;
myControl.do();
myControl.OnSucess=myThreadSucess;
while not terminateddo
application.processmessage;
finally
myControl.free;
end;
end;
procedure MyThread.myThreadSucess(sender:Tobject,..)
begin
postmessage(form1.handle,wm_thredMsg2,1,0);
terminate;//新添代码
end;

现在又出了问题,就是线程可以多次创建,可是在再次创建了几个线程后,就不在创建了!
感谢各位的回答,可怎么给你们积分呢,系统提示说错误,真是!
 
怎么看不出谁调用过myControl.OnSucess泥???
 
myControl.OnSucess=myThreadSucess不是调用吗?怎么有问题吗?
 
接受答案
 
后退
顶部