Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.26;
Скачать: CL | DM;

Вниз

Как правильно запускать несколько потоков?   Найти похожие ветки 

 
dabreezy   (2006-03-11 11:55) [0]

Добрый день. Как праильно запускать потоки, например я запускаю вот так:
Сам поток:

TMyThread1 = class(TThread)
 private
   { Private declarations }
 protected
   mass: Tstringlist;
   procedure Execute; override;
 end;
...
thread_array: array [1..100] of TMyThread1;


Запускаются потоки след. образом:

 thread_running:=0;
 for i:=1 to kol_thread do
  begin
     try
       Thread_array[i]:=TMyThread1.Create(true);
     except
       MessageDlg("Thread number:"+inttostr(i)+" dont run",mtError,[mbOK],0);
     end;
     Thread_array[i].mass:=Tstringlist.Create;
     Thread_array[i].FreeOnTerminate:=true;
     Thread_array[i].OnTerminate:=thread_done;
     inc(thread_running);
     Thread_array[i].Resume;
  end;

Проблема в том что когда эти потоки отработают, и если запустить еще, раз, то почему-то число запущеных потоков <> kol_thread, а постоянно меняется при выполнении программы, например kol_thread=50, а их может быть и 62 и 52 и 65.. пробовал делать динамический массив не получается. Как создать потоки без массива?
Спасибо.


 
MBo ©   (2006-03-11 12:28) [1]


type
 TForm2 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   procedure TerminateThread(Sender: TObject);
 end;

 TMyThread = class(TThread)
 protected
   procedure Execute; override;
 public
   List: TStringList;
   constructor Create(TerminateProc: TNotifyEvent);
   destructor Destroy; override;
 end;

var
 Form2: TForm2;
 Cnt: Integer = 0;
 MaxCnt: Integer = 100;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
 i: Integer;
 Dummy: TMyThread;
begin
 while Cnt < MaxCnt do begin
   Dummy := TMyThread.Create(TerminateThread);
   Inc(Cnt);
 end;
 Caption := IntToStr(Cnt);
end;

{ TMyThread }

constructor TMyThread.Create(TerminateProc: TNotifyEvent);
begin
 inherited Create(True);
 List := TStringlist.Create;
 FreeOnTerminate := True;
 OnTerminate := TerminateProc;
 Resume;
end;

destructor TMyThread.Destroy;
begin
 List.Free;
 inherited;
end;

procedure TMyThread.Execute;
var
 t, c: DWord;
begin
 t := 1 + Random(30);
 c := 0;
 while (not Terminated) and (c < 100) do begin
   Sleep(t);
   Inc(c);
 end;
end;

procedure TForm2.TerminateThread(Sender: TObject);
begin
 Dec(Cnt);
 Caption := IntToStr(Cnt);
end;


 
dabreezy   (2006-03-11 13:00) [2]


> MBo ©   (11.03.06 12:28) [1]

Спасибо большое. Последний вопрос поскольку list создается в конструкторе потока, как каждому потоку в эту переменную записать разные значения до их запуска? Когда был массив, то можно было thread_array[i].list:="abc" и т.п.. А тут только переменная dummy...


 
MBo ©   (2006-03-11 13:07) [3]

Dummy - только что созданный поток. Сразу после создания к нему можно обратиться, например:
Dummy.List.Assign(SomeStrings);
Можно и еще один аргумент конструктору добавить, если при создании нужно что-то записать.

Однако, если нужен доступ к полю потока во время его работы, то придется все же использовать массив или список.


 
dabreezy   (2006-03-11 13:17) [4]


> MBo ©   (11.03.06 13:07) [3]

Большое спасибо! Я правильно понимаю, что можно resume сделать не из конструктора, т.е. убрать из конструктора resume, а потом добавить строки :dummy.list.add("abb"); а дальше написать dummy.Resume. Можно так?

procedure TForm2.Button1Click(Sender: TObject);
....
while Cnt < MaxCnt do begin
  Dummy := TMyThread.Create(TerminateThread);
  Dummy.list.add("abb");
  Dummy.Resume;
  Inc(Cnt);
end;
...
end;


 
MBo ©   (2006-03-11 13:29) [5]

>Можно так?
Да, конечно.


 
dabreezy   (2006-03-11 13:30) [6]


> MBo ©   (11.03.06 13:29) [5]

Спасибо!



Страницы: 1 вся ветка

Текущий архив: 2006.03.26;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.046 c
1-1140602850
denis24
2006-02-22 13:07
2006.03.26
перенос картинки из одного Timage в другой


2-1141741690
Maria
2006-03-07 17:28
2006.03.26
Работа с компонентами


8-1129748506
NEznakOmka
2005-10-19 23:01
2006.03.26
Превращение текстового сообщения в звук


15-1141196909
Ega23
2006-03-01 10:08
2006.03.26
Только что


10-1115368225
Владислав
2005-05-06 12:30
2006.03.26
Маршаллинг интерфейса.