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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2017, 14:53   #1
wowepag
Новичок
Джуниор
 
Регистрация: 29.01.2017
Сообщений: 4
По умолчанию Остановка потока

Доброго дня!

Сам поток:
Код:
type
  TthreadLoad= class(TThread)
  private
...
  protected
    procedure Execute; override;
  end;

procedure TthreadLoad.Execute;
begin
...
  try
    while not terminated do
    begin
....
    end;
  finally
...
  end;
end;
Код:
...
var
threadLoad:TthreadLoad; 
...
Старт:
Код:
  for I := 1 to 100 do
  begin
    threadLoad:= TthreadLoad.Create(true);
    threadLoad.start;
  end;
Стоп:
Код:
  threadLoad.Terminate;
Что делаю не так?
wowepag вне форума Ответить с цитированием
Старый 29.01.2017, 15:07   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от wowepag Посмотреть сообщение
Что делаю не так?
  1. Используете странный (не общепринятый) регистр в имени класса (TthreadLoad вместо TThreadLoad). Ну и имена переменных тоже (смешивание lowerCase и UpperCase), и пробелы вокруг :=, =, после :.
    Лучше стараться придерживаться какого-то общепринятого соглашения, в Дельфи это вроде бы это: http://edn.embarcadero.com/article/10280
  2. В цикле вы создаете 100 потоков (экземпляров того класса), но как я понял указатели на 99 из них никуда не сохраняете. То есть потом Terminate вызываете только у последнего экземпляра.
    Наверно вы не понимаете как работают классы и их экземпляры. Все эти данные (например свойство Terminated унаследованное из базового класса TThread) свои у каждого экземпляра, а не общие для всех.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 29.01.2017 в 15:29.
Alex11223 вне форума Ответить с цитированием
Старый 29.01.2017, 15:34   #3
wowepag
Новичок
Джуниор
 
Регистрация: 29.01.2017
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
указатели на 99 из них никуда не сохраняете. То есть потом Terminate вызываете только у последнего экземпляра.
да, так и есть. Как их можно сохранить?
wowepag вне форума Ответить с цитированием
Старый 29.01.2017, 15:38   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Использовать массив, список (TObjectList, ..., generic если Дельфи 2009+) и т.п.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 29.01.2017, 15:45   #5
wowepag
Новичок
Джуниор
 
Регистрация: 29.01.2017
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Использовать массив, список (TObjectList, ..., generic если Дельфи 2009+) и т.п.
а что легче и предпочтительней?
wowepag вне форума Ответить с цитированием
Старый 29.01.2017, 15:49   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Если количество потоков всегда разное, то список наверно удобнее. (но можно и массив, только придется использовать SetLength).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 29.01.2017, 16:36   #7
wowepag
Новичок
Джуниор
 
Регистрация: 29.01.2017
Сообщений: 4
По умолчанию

Глобальные переменные
Код:
var
  threadLoad:TthreadLoad; 
  ListThread: TObjectList;
FormCreate
Код:
  ListThread := TObjectList.Create;
Старт
Код:
  for I := 1 to 100 do
  begin
    threadLoad := TthreadLoad.Create(true);
    threadLoad.start;
    ListThread.Add(threadLoad);
  end;
Стоп
Код:
  for I := 0 to ListThread.Count do
  begin
    (ListThread.Items[i] as TThread).Terminate;
  end;
Вроде бы завершает потоки, но когда стоп жму, получаю ошибку: "List index out of bounds (100)". Что делаю не правильно?
wowepag вне форума Ответить с цитированием
Старый 29.01.2017, 17:24   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так если 100 элементов, то в нем индексы 0-99, а не 0-100.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Остановка потока vipok72 Общие вопросы Delphi 5 01.08.2015 23:17
Как получить доступ к методу потока(TThread) из основного потока? Pcrepair Общие вопросы Delphi 3 30.03.2013 14:52
Должно быть 3 потока. А диспетчер задач показывает, что потока создано 2 BEL9ILLI Общие вопросы Delphi 3 06.12.2011 20:26
Немедленная остановка потока. Altera Общие вопросы Delphi 16 07.02.2009 11:17
Управление потоками. Запуск, остановка, приоритет потока. metamfetamin Помощь студентам 5 11.11.2007 12:45