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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2014, 17:49   #21
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А я обычно прямо в конце execute пописываю освобождение памяти, ессно согласно той схемы что я показал в примере.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.02.2014, 18:02   #22
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А я обычно прямо в конце execute пописываю освобождение памяти, ессно согласно той схемы что я показал в примере.
То есть в конце execute достаточно прописать Free; и все?
bilibian вне форума Ответить с цитированием
Старый 23.02.2014, 18:09   #23
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
По умолчанию

Ни в коем случае не делать инициализацию переменных и их освобождение в Execute!

Ибо, при определенных обстоятельствах, могут быть утечки памяти.

Только в Create и Destroy!
STRELOK-2007 вне форума Ответить с цитированием
Старый 23.02.2014, 18:20   #24
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от bulldog5293 Посмотреть сообщение
завести обработчик onterminated и внём убивать, +можно на форме сообщать что такой то поток убит или что ни будь другое

Например так?

Код:
procedure TForm1.Button2Click(Sender: TObject);
  var i:Integer;
  ThreadArray: array [1..3] of Thr;
begin
    for i:=1 to High(ThreadArray) do
    begin

      ThreadArray[i]:=Thr.Create(true);
      ThreadArray[i].FreeOnTerminate:=false;
      ThreadArray[i].OnTerminate := ENDTerminated;
      ThreadArray[i].Resume;
      ThreadArray[i].Priority:=tpNormal;

    end;
end;

procedure TForm1.ENDTerminated(Sender: TObject);
begin
  Free;
end;
Или я ошибаюсь?

Последний раз редактировалось bilibian; 23.02.2014 в 18:37.
bilibian вне форума Ответить с цитированием
Старый 23.02.2014, 18:54   #25
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
То есть в конце execute достаточно прописать Free; и все?
Нет. Ты не понял )
Я создаю перед циклом нужные мне объекты, а после цикла их освобождаю. Только так эта схема работает нормально. И при завершении потока принудительно обязательно использую WaitFor чтоб быть уверенным что все что поток на себя взял освободится.
А то что ты хочешь сделать Как сказал STRELOK-2007 нельзя так просто.
Я вообще не понимаю почему ты написал ThreadArray[i].FreeOnTerminate:=false;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.02.2014, 19:01   #26
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Я вообще не понимаю почему ты написал ThreadArray[i].FreeOnTerminate:=false;
Я бы с удовольствием написал FreeOnTerminate:=True; и не парился. Но в таком случае я буду уведомлен об ошибке Thread Error: Неверный дескриптор (6) с которой я не совсем понимаю как разобраться.
bilibian вне форума Ответить с цитированием
Старый 23.02.2014, 19:30   #27
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

bilibian убедительная просьба, прочитай хотя бы эту стотью для начала http://forum.vingrad.ru/topic-60076.html что бы отпали многие вопросы, она всё ещё актуальна для новичков, там всё показано для начинающей работе с потоками/ Вот навскидку пример с многопоточностью/ Надеюсь 60% вопросов отпадёт
Вложения
Тип файла: rar Proxy_Checker_Source_.rar (30.7 Кб, 15 просмотров)

Последний раз редактировалось bulldog5293; 23.02.2014 в 19:44.
bulldog5293 вне форума Ответить с цитированием
Старый 23.02.2014, 19:34   #28
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Но в таком случае я буду уведомлен об ошибке Thread Error: Неверный дескриптор (6) с которой я не совсем понимаю как разобраться.
Так это надо твой код анализировать, чтоб сказать что же у тебя падает.
Почему-то у меня такой ошибки нет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.02.2014, 19:46   #29
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Еще бывает проблема, когда поток останавливается сам по себе. То есть он работает, работает, а потом внезапно исчезает. Например работает приложение в 5 потоков, через некоторое время, потоков уже 3. При этом свое задание они не выполнили. они просто остановились и все.

Каждый из потоков собирает инфу с сайта.

В чем может быть дело?
bilibian вне форума Ответить с цитированием
Старый 23.02.2014, 20:04   #30
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
В чем может быть дело?
В неправильно написанном коде.
Еще раз повторюсь: Сам по себе поток не может лажать. Если он как-то не так работает, значит автор программы чего-то не предусмотрел. Но чего - известно только автору.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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