Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1141632664
Бугага
2006-03-06 11:11
2006.03.26
Запустить PHP скрипт в планировщике


1-1140854033
аноним
2006-02-25 10:53
2006.03.26
Frame в run-time :)


1-1140168422
kyn66
2006-02-17 12:27
2006.03.26
Как доработать компонент


2-1141896678
VitV
2006-03-09 12:31
2006.03.26
Использование LookUpField с отображением в dbgrid


15-1141514739
lookin
2006-03-05 02:25
2006.03.26
Я прослезился...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский