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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2015, 14:16   #11
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Давай так. Мои шутки, они и есть - шутки. Но, если по-серьёзному. Можно открыть, хоть 100500 потоков. Вопрос: нужны-ли они? Я обхожусь двумя-тремя. Над четвёртым уже задумываюсь "а нахрен он нужен". Действительно, оказавается и нахрен не нужен.
есть один основной поток который парсит 10 ссылок, для каждой ссылки нужен поток, я его и запускаю, в случае если в этой ссылке произошла ересь или нету того что мне надо я завершаю его, а для переменных память выделилась, как ее освободить никто не говорит

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Не надо Exit внутри except...end: прокатить - прокатит, но может породить плавающую ошибку. Лет 100500 назад читал где-то и запомнил.

FreeOnTerminate гарантирует освобождение памяти только из-под самого объекта. Если он в процессе работы наклянчил у системы ещё какую-то память, то он должен отдать её при разрушении - например в деструкторе.
По моему про это кто то говорил выше, а говорить другими словами - бессмысленно

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
1-ое) это поток не данных, а поток исполнения, в него ничего не пишут.
2-ое) поток спит во время передачи.

ТС, как сказали выше ваш поток должен сам за собою подчищать, а ему для этого события не нужны.
ok, мне уже третий сказал что мне нужно чистить то что занял поток, Я И САМ ПРО ЭТО СКАЗАЛ, вопрос не в том что мне делать, вопрос в том КАК ЭТО СДЕЛАТЬ, прошу пример

Последний раз редактировалось Аватар; 04.08.2015 в 14:30.
vipok72 вне форума Ответить с цитированием
Старый 04.08.2015, 14:20   #12
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Вы правы, нет, я так понимаю для этого и понадобится OnTermonate?
Нет, для этого понадобится
Код:
potok =class(zzz)
public
destructor Destroy; override;
end;
Цитата:
А дальше надо смотреть КАК написан твой Destroy.
http://programmersforum.ru/showthrea...hlight=Destroy
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 04.08.2015 в 14:28.
evg_m вне форума Ответить с цитированием
Старый 04.08.2015, 14:21   #13
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Давай так. Можно открыть, хоть 100500 потоков.
2024 потоков на 1 гигабайт , больше не получается.


Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Я обхожусь двумя-тремя. Над четвёртым уже задумываюсь "а нахрен он нужен". Действительно, оказавается и нахрен не нужен.
всё зависит от решаемой задачи. Например копирование огромного файла лучше делать большим числом потоков , быстрее будет.
Когда то , когда я был маленьким и дурным, писал конвертор с формата DXF (автокадовский текстовый обменник) . Так он на пентюхе 4-м с гигом оперативки и виндой хр-юшкой "всасывал" полторагигабайтный файл и создавал чертёж за 5-10 минут, тогда, когда его конверторы-собратья делали это за 40-60 минут. Правда мой конвертор присасывался в разные точки файла 16-тью отдельными потоками, аж винт с куллером свистели, а стандартные конверторы сосали шпагетину в одну дырку...
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 04.08.2015, 14:23   #14
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Нет, для этого понадобится
Код:
potok =class(zzz)
public
destructor Destroy; override;
end;
Первый человек который сказал как мне это сделать, спасибо
Теперь встает вопрос о том как собстна почистить переменную прописанную в threadvar чтобы можно было потокам продолжать пользоваться данной перменной, а конкретно у этого потока почистить переменную
Free?
Clear?
Что? Есть переменные типа Integer, Float, String

Последний раз редактировалось vipok72; 04.08.2015 в 14:41.
vipok72 вне форума Ответить с цитированием
Старый 04.08.2015, 14:49   #15
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от vipok72 Посмотреть сообщение
Первый человек который сказал как мне это сделать, спасибо
Теперь встает вопрос о том как собстна почистить переменную прописанную в threadvar чтобы можно было потокам продолжать пользоваться данной перменной, а конкретно у этого потока почистить переменную
Free?
Clear?
Что?
вот тут как раз тот случай, когда есть прямой и однозначный ответ зачем плодить резиновые массивы объектов.
Пока программист будет ждать расчехления винды для удаления текущего потока, лучше валить его самостоятельно.
Автор, я не работал никогда с threadvar но в делфи 7 я делаю это приблизительно вот так

Код:
TMyThread = class (TThread)
  handle : HWND;
  номер_в_массиве : integer;
  procedure Execute();
  ......
end;

TForm1 = class(TForm)
   THS : array of TMyThread;
   procedure ThreadMsg(var message : TMessage); message XXX;
..............
   procedure AddThread();
end;
...........


procedure TForm1.AddThread();
begin
   setlength(THS, length(THS)+1);
   THS[high(THS)] := TThread.Create(true); // со стартом
   THS[high(THS)].номер_в_массиве := high(THS);
   THS[high(THS)].handle := Handle; // сюда будем слать всякие сообщения
end;

procedure TForm1.ThreadMsg(var message : TMessage);
begin
  // обрабатываем сообщение от потока
  // если пришло сообщение что потоку пи..ц
  if message.LParam = код_сообщения_пи..ц then
  begin
    // этот элемент массива можно валить
    // подождём пару миллисекунд и валим
    sleep(100);
    THS[message.WParam].terminate;
    THS[message.WParam] := nil;
  end;
end;



procedure TMyThread.Execute();
begin
   while not Terminated and ВЫПОЛНЯЕМАЯ_РАБОТА do
   try
     чё то делаем
   
   except
      тут произошёл какой то сбой
   end;

   // если мы тут, значит поток своё сделал или накрылся "помидорным мхом"
   // отслылаем на главную форму извещение что потоку назступил пи..ц
   sendmessage(handle, XXX, номер_в_массиве, код_сообщения_пи..ц);
end;
Не знаю как в делфи ХЕn.. но в делфи 7-й такой способ уничтожения потоков никогда не приводил к утечкам памяти. Всё по закону - кто породил тот и валит, не ожидая милости от Винды
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 04.08.2015 в 17:52.
JUDAS вне форума Ответить с цитированием
Старый 04.08.2015, 15:55   #16
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию

JUDAS, ответа на свой вопрос я не увидел...
Увидел только обнуление перменной и все
Код:
THS[message.WParam] := 0;
Если что у меня D7

Последний раз редактировалось vipok72; 04.08.2015 в 15:58.
vipok72 вне форума Ответить с цитированием
Старый 04.08.2015, 16:15   #17
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
в случае если в этой ссылке произошла ересь или нету того что мне надо я завершаю его, а для переменных память выделилась,
Именно для ТАКИХ случаев (гарантированно выполнить некоторый код в любом случае , в т.ч и при сбоях И при этом НЕ ПОТЕРЯТЬ информацию о возможном сбое) и придуман finally

Код:
// Выделили память (!!! до try)
try //не уверены что все пройдет как надо
  //делали -делали и СДЕЛАЛИ 
  //память больше не нужна, а вдруг сбой но память все равно  не нужна
finally // =делать ВСЕГДА (и при сбоях и без)
  //  освободим ПАМЯТЬ выделенную ДО(!) try
end;
// продолжаем что-то делать ЕСЛИ(!) все до этого прошло как надо
//  если БЫЛ сбой(except) то СЮДА мы НЕ ПОПАДЕМ!!!
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 04.08.2015 в 16:19.
evg_m вне форума Ответить с цитированием
Старый 04.08.2015, 17:24   #18
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от vipok72 Посмотреть сообщение
JUDAS, ответа на свой вопрос я не увидел...
Увидел только обнуление перменной и все
Код:
THS[message.WParam] := 0;
Если что у меня D7
Автор ,а этажом выше что написано?
п.с если чё у меня тоже делфи 7.
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 04.08.2015, 17:46   #19
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
Автор ,а этажом выше что написано?
п.с если чё у меня тоже делфи 7.
Код:
THS[message.WParam].FreeAndRelease;
Я почитал о FreeOnRelease, я так понял что это для уничтожения данных после того как отработает программа...
vipok72 вне форума Ответить с цитированием
Старый 04.08.2015, 17:53   #20
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Сча я те код нашкрябаю. Разберёшься
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Освобождение памяти Smolya Общие вопросы C/C++ 4 23.02.2015 19:38
Освобождение памяти SAMOUCHKA Общие вопросы по Java, Java SE, Kotlin 7 26.01.2014 21:24
Освобождение памяти millepetrozza Общие вопросы C/C++ 4 27.10.2012 15:13
Освобождение памяти PUH Помощь студентам 1 22.11.2009 17:14
Освобождение памяти VadEr Общие вопросы Delphi 2 17.04.2009 22:23