Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2014, 22:11   #1
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию Запуск нескольких потоков

Привет!

Создаю класс потока:

Код:
type
    Thr = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;
  ThreadArray: array [1..3] of Thr;
Запускаю поток так:
Код:
for i:=0 to Length(ThreadArray)-1 do
begin
      ThreadArray[i]:=Thr.Create(param1,param2,param3);
      ThreadArray[i].FreeOnTerminate:=true;
      ThreadArray[i].Resume;
      ThreadArray[i].Priority:=tpNormal;
end;
В итоге получаю вот это: "cannot call start on a running or suspended thread"

Что я сделал не так?
bilibian вне форума Ответить с цитированием
Старый 21.02.2014, 22:47   #2
wendstor
Пользователь
 
Аватар для wendstor
 
Регистрация: 28.12.2011
Сообщений: 20
По умолчанию


Внимательно смотрим:
Код:
ThreadArray: array [1..3] of Thr;
и
Код:
for i:=0 to Length(ThreadArray)-1 do
у вас массив нумеруется с 1 до 3-х, а в цикле с 0 до 2. Правильно будет:
Код:
for i:=1 to High(ThreadArray) do
wendstor вне форума Ответить с цитированием
Старый 21.02.2014, 22:49   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Правильно будет:
Нет. Правильно будет:
Код:
for i:=Low(ThreadArray) to High(ThreadArray) do
А еще правильнее будет использование TThreadList
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.02.2014, 22:52   #4
wendstor
Пользователь
 
Аватар для wendstor
 
Регистрация: 28.12.2011
Сообщений: 20
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Нет. Правильно будет:
Код:
for i:=Low(ThreadArray) to High(ThreadArray) do
А еще правильнее будет использование TThreadList
Если динамический массив то да, а если жёстко привязано то не важно...
wendstor вне форума Ответить с цитированием
Старый 21.02.2014, 22:54   #5
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

wendstor, спасибо за помощь, но ошибка все равно осталась.

Как только я убираю это:
Код:
ThreadArray[i]:=Thr.Create(param1,param2,param3);
и ставлю это:
Код:
ThreadArray[i]:=Thr.Create(true);
Плюс комментирую конструктор. И все начинает работать, но мне нужно параметры передать.
bilibian вне форума Ответить с цитированием
Старый 21.02.2014, 23:06   #6
wendstor
Пользователь
 
Аватар для wendstor
 
Регистрация: 28.12.2011
Сообщений: 20
По умолчанию

Пример:
Код:

  public
    constructor Create(aparam1: String; aparam2: String; aparam3: String; aparam4: Integer; aparam5: Integer);

constructor TMyThread.Create(aparam1: String; aparam2: String; aparam3: String; aparam4: Integer; aparam5: Integer);
begin
  inherited Create(True);
  FreeOnTerminate:=True;
  param1:=aparam1;
  param2:=aparam2;
  param3:=aparam3;
  param4:=aparam4;
  param5:=aparam5;
end;
wendstor вне форума Ответить с цитированием
Старый 21.02.2014, 23:13   #7
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

wendstor, точно! Спасибо!
bilibian вне форума Ответить с цитированием
Старый 22.02.2014, 20:29   #8
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Как теперь уничтожить запущенные потоки?

С одним понятно, поставил terminate в true и потом отлавливаешь его в потоке, но как быть с несколькими потоками?

Как их все завершить принудительно?

Код:
procedure TForm1.Button2Click(Sender: TObject);
  var i:Integer;
  ThreadArray: array [1..3] of Thr;
begin
  if button2.Tag = 0 then
  begin
    button2.Tag:=1;
    for i:=1 to High(ThreadArray) do
    begin
      ThreadArray[i]:=Thr.Create(true);
      ThreadArray[i].FreeOnTerminate:=true;
      ThreadArray[i].Resume;
      ThreadArray[i].Priority:=tpNormal;
    end;
  end
  else
  begin
    button2.Tag:=0;
    for i:=1 to High(ThreadArray) do ThreadArray[i].Terminate;
  end;
end;

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

Последний раз редактировалось bilibian; 22.02.2014 в 22:04.
bilibian вне форума Ответить с цитированием
Старый 22.02.2014, 21:03   #9
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
По умолчанию

TerminateThread

в качестве Handle, передаешь TThread.Handle
STRELOK-2007 вне форума Ответить с цитированием
Старый 22.02.2014, 21:16   #10
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Выскакивает ошибка на TThread.Handle.

пишу так:
Код:
TerminateThread(TThread.Handle,0);
bilibian вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание нескольких потоков iKarma Общие вопросы Delphi 9 20.10.2011 18:11
Запуск нескольких потоков bulldog5293 Общие вопросы Delphi 3 11.11.2010 18:24
Как реализовать запуск и контроль нескольких однотипных потоков. Son Общие вопросы Delphi 5 29.04.2010 08:40
Работа с файлом из нескольких потоков boris-blade Общие вопросы .NET 2 02.04.2010 17:21
Запуск потоков в цикле VALERO Общие вопросы Delphi 11 01.03.2009 14:57