多线程建立,退出,终止 等问题(100分)

  • 主题发起人 主题发起人 sefeng1982
  • 开始时间 开始时间
S

sefeng1982

Unregistered / Unconfirmed
GUEST, unregistred user!
主进程建立一个线程 M, 大M 建立5个线程 (a,b,c,d,e);
其中a,b,c 根据 主进程传进来的参数 建立(afalg,bflag,cflag)
if aflag then
a:=mythread1.create(false);
if bflag then
b:=mythread1.create(false);
if cflag then
c:=mythread1.create(false);
d,e 在a,b,c 线程都执行完后再建立
现在的问题是:
1,d,e 的判断条件得如何写?
2,主进程如何通知 线程退出, 线程如何告知主进程执行结束。
希望有个简单的代码模型 ,谢谢~~~~
 
呀,果然是如此冷清
 
你的a,b,c三个线程都是一样的撒,那就用onterminate这个事件来处理,这里面加一个计数器,数量为3,每个线程退出就减1,当这个计数器为0的时候,触发一个事件setevent,然后在你的大M的线程中用waitforsingleobject来等待这个事件的到来,接受到这个事件,那就建立线程c和d,解决了.
 
to cqwty,
能简单的写个例子吗?特别是那个事件通知那里。
还有我在主进程通知线程退出的时候,设置了全局变量,但整个程序就死在某个地方了,压根就不是一个个线程安全退出。
 
哎呀,直接用timer监视变量就可以了啊!
Var
CreateCD : Byte = 0;
procedure mythread1.execute;
begin
while ()do
begin

end;
inc(CreateCD);
end;

procedure ontimer;
begin
if CreateCD<3 then
exit;
timer.enabled:=false;
d:=mythread1.create(false);
....
end;
 
var
mutex:array[0..2]of Thandle;
主线程创建时(resume前)创建3个mutex:
metux[0]:=CreateMutex(...);
metux[1]:=CreateMutex(...);
metux[2]:=CreateMutex(...);
然后resume。
主线程的excute里创建a,b,c,d,e:
在a创建时(Create里),EnterMutex(...mutex[0]...).
在b创建时(Create里),EnterMutex(...mutex[1]...).
在c创建时(Create里),EnterMutex(...mutex[2]...).
接着,waitMultiMutex(...mutex...INFINATE)
接着创建d,e.
///////////////////////
主进程如何通知 线程退出
///////////////////////
直接,terminatethread(threadA.handle)即可。

///////////////////////////
线程如何告知主进程执行结束
//////////////////////////
这个,个人感觉是最不好实现的了。
可以在主进程里创建一个句柄AllocHandle(MyWndProc);
procedure MyWndProc(var MSG:TMessage)
begin
case MSG of
ThreadADestroy: self.free(或者其它操作);
TreadBDestroy:.....;
TreadCDestroy:.....;
TreadDDestroy:.....;
TreadEDestroy:.....;
else
...
end;

end;

然后,在每个线程a,b,c,d,e的OnTerminate里发送消息(sendMessage)
拙见。

想听高手的。
 
1,d,e 的判断条件得如何写?
  等待多个线程结束,请使用 API waitformultipleobjects 这个函数可能满足你的要求!也是最简单的方法的。
2,主进程如何通知 线程退出, 线程如何告知主进程执行结束。
  通知线程结束你可以使用一个全局变量,在线程的循环里增加检查这个全局变量的值,
以便释放资源后立即退出。(当然你也可以使用CloseHandle强制释放,但是资源不释放,这样很危险)
  线程发消息给主线程,告诉主线程,自己将要立即结束。
参考代码:
var
ThreadArray : array [0..threadcount-1] of thandle;

for i := 0 to threadcount-1do
begin
with TUnzipThread.Create(self.Handle,MyDestDir,IntToStr(i+1))do
begin
if threadcount - 1 = i then
L := k + (FfulltemplateGUId.Count mod threadcount) ;
for j := 0 to L-1do
AddzipFile(swfdir+zipfiles.Strings[i*k+j]+'.zip');
Resume ;
ThreadArray := Handle ;
end;
end;

re := waitformultipleobjects(threadcount,@ThreadArray,TRUE,INFINITE) ;
 
提醒,多线程时要考虑同步问题,使用临界区要方便一点。
 
terminatethread 确实可能出现不释放资源的问题。ms的sdk上有 说明。
thread.terminate即可。
waitMultiMutex(...mutex...INFINATE) 这里可能出现死锁, 因为当无限等待时,线程不能接受任何操作。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
663
import
I
I
回复
0
查看
615
import
I
后退
顶部