关于动态创建多线程的问题,大家帮帮忙啦,5555555555,可怜,我只给的了10分。(10分)

  • 主题发起人 主题发起人 jxzqsun
  • 开始时间 开始时间
J

jxzqsun

Unregistered / Unconfirmed
GUEST, unregistred user!
有多少个线程,就要创建多少个线程实例,但是我的线程数量是不确定的,怎么办呢?
我动态创建线程,所以有多少个线程我也不知道,所以我实例不好多创建,而且如果线程数比较多的话,那我手工创建线程也太多了吧?
 
用数组,链表,每一项都对应一个TTHREAD不就可以了吗?
当然如果有(不过最好避免)多个线程同时要读写此链表的话,别忘了用临表段之类的东东。
 
给个例子,好么?
 
用动态数组
TMyThead定义略...
MyThreadList: array of TMyThread;
SetLength(MyThreadList, 5)
for i := 0 to length(mythreadlist) - 1do
mythreadlist := tmythread.create(false);
 
从实际使用的角度回答此问题:
应该是服务程序才需要创建如此多的线程进行工作,但是线程数的多少是对进程效率
有影响的,故线程创建的最大数,应该视实际情况(负荷及服务器性能等)确定。
针对你的问题,可以用参数设置最大的可用线程数。然后就可以进行定义线程资源数组了
来一个,创建一个,并分配资源。当然是在最大线程数内


 
MyThreadList: array of TMyThread;
SetLength(MyThreadList, 5)
for i := 0 to length(mythreadlist) - 1do
begin
mythreadlist := tmythread.create(false);
mythreadlist.OnTerminate :=ThreadDone;
end;

// 下面是线程结束时要执行的"ThreadDone"
procedure Tform1.ThreadDone(Sender: TObject);
begin
{怎样才可以在 ThreadDone 中知道,哪个线程结束了!}
end;

怎样才可以在 ThreadDone 中知道,哪个线程结束了!就是说

mythreadlist[0]
mythreadlist[1]
mythreadlist[2]
mythreadlist[3]
mythreadlist[4]
mythreadlist[5]
中哪个线程结束了?
 
用TList,或TStrings来管理,
加载线程的OnTermiated事件
procedure TForm1.AddThread(Name: string = '');
var
Thread: TMyThread;
ThreadName: string;
begin
if Name = '' then
ThreadName := IntToStr(FList.Count + 1);
Thread := TMyThread.Create(...);
Thread.OnTermated := OnThreadTermiated;
FList.AddObject(ThreadName, Thread);
end;

//Thread 's OnTermiated Event
procedure TForm1.OnThreadTermiated(Sender: TObject);
var
Index: Integer;
begin
Index := FList.IndexOfObject(Sender);
if Index <> -1 then

begin
//TODO: Add you code
ShowMessage('第'+Flist+'死了');
FList.Delete(Index);

end;
end;
 
“copy_paste”好多谢你的回答,我是刚学Delphi的,你的代码我还有一点看不懂!
我去试试看,多谢![:)]
 
你是不是在处理socket的多线程,如果是的话,就不需要这么复杂
 
不好意思,socket我不知道是什么啊!如果不用这么复杂要怎样搞啊,我是刚学Delphi的!
谢谢!
 
Adnil,就已经说了答案,就是用个数组保存每个线程对象的指针,同时用一个变量表示数组的有效长度,也就是末尾。。
 
....
FList.AddObject(ThreadName, Thread);
....
这个 FList 是在哪里定义的?
 
后退
顶部