Форум: "Начинающим";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
ВнизКак правильно запускать несколько потоков? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.041 c