多线程的管理 ( 积分: 50 )

J

javesun

Unregistered / Unconfirmed
GUEST, unregistred user!
一个管理线程创建多个子线程来进行任务,并等待子线程的完成情况。这个等待的过程大家怎么处理,创建事件/互斥/信号等待?这样的话不是要
while waitforsingleobject(hHWND, 100)<> .....do
if waitforsingleobject(hHWND1, 100)<> .....
if waitforsingleobject(hHWND1, 100)<> ..... ??
以前没有做过类似的,哪位做过,分些经验与我,谢谢。
 
做线程池
 
做个子线程的标志数组,管理线程定时检查标志数组就好了。
 
用TThreadList管理线程,创建事件
 
创建管理线程TManagerThread,分别用来创建子线程A,B,C,这些子线程可以放入自己管理的一个线程池中,当所有子线程都创建成功后,就触发管理线程中的一个事件hCreateEvent,同时管理线程挂起,调用WaitForMutileObject(大概这么写)等待所有的线程池中的线程结束,当所有子线程都结束后,就触发hEndEvent事件。让管理线程终止。
 
先谢谢大家!
不好意思,有一个地方我没有说明白:子线程是循环使用的,不是只执行一次,要进行多次运行。但我要获取子线程每次执行的情况。
假设:有3个子线程,共有10个任务(任务是类似的),子线程谁先执行完,就自动执行下一个任务,直至10个任务都完成。。。
 
给子线程创建事件,在事件里触发下个任务
 
如果线程执行过程无需进行干涉和交互,那我提供个办法,用线程池函数,
function QueueUserWorkItem(const lpStartAddress, lpContext: pointer;const uFlags: UINT): BOOL;stdcall;external 'kernel32.dll';
另外借宝地解决自己的问题:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3662188
 
to hs-kill:你说的这个那不成我开头写的了吗?
 
.....这个 如果是我,比如TTS是个线程类,有个事件OnExit
假设我创建了100个任务对象,用个list:tlist;来管理(不知道你的任务是什么,我假设是个对象,传递到线程里进行处理),有个公共任务对象指针NowObj:integer;
TTS类处理任务通过.obj属性传递任务对象方式处理(假设)
for i:=0 to 9do
begin
tmpObj:=Tobject.creat(nil);
list.add(tmpObj);
end;

写好事件的内容
procedure TSEXIT(sender:tobject);
begin
if nowobj<list.count-1 then
begin
inc(nowobj);
tts(sender).obj:=tobject(list[nowobj]);
end;
end;
 
不太明白,要仔细看看。。。
 
发消息给主线程报告自己(子线程)的运行情况。
 
MsgWaitForMultipleObjects
 
barton 您好。呵呵,他这里只要 TThread(SubThread).OnTerminate 就够了。你那篇后台线程读书的论文真是太好了,可惜我没跑起来 (因为没装.net)。另祝新年愉快。
 
小雨哥,你好!在某些情况下.net方便一点,某些情况下还得win32。所以我偶尔还是用delphi,特别是COM相关的东西。
 
大家都说的很好.....
我一般是让子线程去通知主线程.......大概就是caidanxu所说的吧
type ISubject=iinterface //主线程继承该接口
procedure RecvNotification;
end;

type IObserver=iinterface //子线程继承该接口
procedure Notify;
end;

TMainThread=class(TThread,ISubject)
.....
procedure CreateSubThread;
procedure RecvNotification;
.....
end;

TSubThread=class(TThread,IObserver)
.....
procedure Notify;
.....
protected
procedure Execute;override;
.....
end;

TMainThread.RecvNotification;
begin
showmessage('子线程对你说xxxxx');
end;

TMainThread.CreateSubThread;
var
i:integer;
begin
for i:=0 to xxx
begin
//创建子线程
end;
end;
.......
procedure TSubThread.notify;
begin
ISubject(FMainThread).RecvNotifycation;
end;

procedure TSubThread.Execute;
begin
....
synchronize(notify);
//通知一下主线程
...
end;
 
to 小雨哥:
这个是我简化了的模型,在子线程运行的过程中要与管理线程进行多次通讯。。。
 
to caidanxu:
偶试着用postthreadmessage时,在简单的程序里,postthreadmessage传递的值没有错误,一切运行正常,但当并行的任务很多时或系统繁忙时,所传递的值会出现异常。例如,我用子线程抽取数据库里的表时,传递的是表名,但后来会有表里的记录在中间穿插。所以,感觉传递消息有时不太稳定。
 
to linuxping:
先谢谢你的帮助。
不过还有几个问题:小弟才疏学浅,不知道你的FMainThread是来自哪里,全局变量吗?
TMainThread.RecvNotification;
begin
showmessage('子线程对你说xxxxx');
end;
线程里好象不能直接用ShowMessage吧,退一步说,能用的话,怎么能知道是哪个子线程在说呢?
另synchronize只能与VCL的主线程进行同步,有很多的地方不便使用。
 
用多线程,在同一窗体中使三个进度条(ProgressBar)同时跑,并且可以暂停和恢复其中任一个,该怎么实现。我没能作成功,谁能帮帮忙?
 
顶部