子线程运行完毕后通知主线程时出现错误(20分)

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

cgs1980

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在主线程中启动一定数量的子线程,如 10 个子线程,如果某一个子线程运行完毕,那么就通知主线程再启动一个新的子线程(主线程想知道是哪个子线程运行完毕),由此使子线程的数量保持在 10 个左右,我使用下面的方法,但启动新的子线程时会出错,试了好多次都不行,敬请大家指教,同时我想知道在delphi中子线程运行完毕之后通知主线程是否有更好的方法?
代码:
unit ThreadsDemo;
type
 TMainThread = class(TThread)
 private
   str: string;
   SubThreadList: TList;
 //线程列表
   procedure CreateNewSubThread(Sender: TObject);//创建新线程
  protected
    procedure Execute;
override;
  public
    constructor Create(str: string);
 end;

  TSubThread = class(TThread)
  private
    FStr: string;
    functiondo
SomeThings(str: string): boolean;
  protected
    procedure Execute;
override;
  public
    constructor Create(str: string);
  end;
var
  ThreadsArray: array of TSubThread // 定义线程数组
  counter: Integer;
 //线程计数
procedure TMainThread.Execute;
var
  i: Integer;
begin
 counter:= 0;
 SubThreadList := TList.Create;
 SetLength(ThreadsArray,10);
  // 动态设置线程的数量 
 for i := 0 to 9do
    begin
         ThreadsArray[i] := TSubThread.Create(str);
         ThreadsArray[i].OnTerminate := CreateNewSubThread;
         SubThreadList.Add(ThreadsArray[i]);
         Inc(counter);
    end;
end;
procedure TMainThread.CreateNewSubThread(Sender: TObject);
var
  Index: integer;
begin
  if counter > 100  then
     exit;
//[red]在list中查找刚才的线程对象, 为什么在这里会出错?[/red]
  Index:=SubThreadList.IndexOf(Sender);
  
  SubThreadList.Delete(Index);
  ThreadsArray[index] := TSubThread.Create(str);
  ThreadsArray[index].OnTerminate := CreateNewSubThread;
  SubThreadList.Add(ThreadsArray[i]);
  Inc(counter);
end;
procedure SubThreadList.Execute;
begin
 do
SomeThings(FStr);
end;

end.
 
在线程中不能再创建线程,最起码要在同步的情况下,也就是说在主线程中才能创建.
 
谢谢活化石的回答,我在主线程中添加了同步控制,同时取消了线程列表,现在可以正常运行了。我想请教一下,在子线程的 create 函数中,已经设置了 FreeOnTerminate := True;
如果主线程启动了很多子线程,那么是否占用的内存资源越来越多?
 
在子线程的 create 函数中,已经设置了 FreeOnTerminate := True;
如果主线程启动了很多子线程,那么是否占用的内存资源越来越多?
这似乎与FreeOnTerminate := True 无关,这只是一个析构方式.
启动很多线程必然,占用资源.但现在似乎在多核的情况下,又鼓励使用多线程.我觉得什么适度为最好,最难的是什么时候是适度.对了,别说请教,我也很菜.
 
线程当然吃CPU了。多少线程适度要看机器性能啊
 
谢谢各位的热心回答,我自己应该在实际的编程实践中多测试一下,把问题搞明白。
 

Similar threads

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