Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.04.2017, 10:51
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию Поток в потоке

есть некий поток дочерний. в главном он объявлен как массив
Код:
fNewTh: array [1..12]of Arr;
По отработке (как я думал) они освобождаются, но как мне создать новый экземпляр потока на месте отработанного, а не забивать новый элемент массива?
Код:
i:= Length(fNewTh)+1;
   fNewTh[i]:=Arr.Create();
но оно. очевидно вернет 13. а не индекс заполненных элементов.

Последний раз редактировалось nixon232, 29.04.2017 в 12:52.
Ответить с цитированием
  #2  
Старый 29.04.2017, 17:16
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Получается, что поток (а наверное ссылка), остается в FNewTh[i]? потому что он не равен Nil?
Код:
for i := 1 to 12 do
    begin
    TMP:= fNewTh[i];
      if not Assigned(tmp) then

тогда где ему нил присвоить если мы не мониторим завершение экземпляра?
Ответить с цитированием
  #3  
Старый 30.04.2017, 06:05
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

А и не должно значение само в nil сбрасывается. Делай это при завершении потока. Вариантов много.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 30.04.2017, 12:29
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Цитата:
Сообщение от NumLock
А и не должно значение само в nil сбрасывается. Делай это при завершении потока. Вариантов много.
ну мне хватит и одно. пробовал в терминейт дочернего объекта прописать
Код:
self:=nil;
Но Assigned дает true.
По дебагеру видно, что остались внутпеные даннык которые были созданы в Create
Код:
begin
inherited Create(False);
a:=RBTN;
b:= CBTN;
c:=time;
d:=id;
FreeOnTerminate:=True;
OnTerminate:=WBTerminate;
end;

Последний раз редактировалось nixon232, 30.04.2017 в 12:32.
Ответить с цитированием
  #5  
Старый 30.04.2017, 19:36
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Странно, но если в главном потоке послать такое, то ошибок нет и он оба раза шлет сигнал на поток
Код:
begin

  FreeAndNil(FLock);
  FBan.Free;
  for i := 1 to 12 do
  begin
  tmp:=   fNewTh[i];
    if tmp<>nil  then
         tmp.Terminate;
  end;

  for i := 1 to 12 do
  begin
  tmp:=   fNewTh[i];
    if tmp<>nil  then
         fNewTh[i].Terminate;
  end;
  inherited Destroy;

end;
в самом потоке уже осталось Sleep(1000); и все. получается он не завершается? но ведь доходит до Destroy.

Последний раз редактировалось nixon232, 30.04.2017 в 19:41.
Ответить с цитированием
  #6  
Старый 01.05.2017, 14:20
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

переписал на Tlist Вместо Array of TA, а, в терминайте присваиваю
Код:
 Self:=nil
Создаю поток:
Код:
       fNewTh.Add(TA.Create(....));
Он себе спокойно отрабатывает, доходит до дестроя, но при такой проверке пытается уничтожить объект, которого нет, получает отказв доступе код 5 и вылетает
Код:
begin

  FreeAndNil(FLock);
  FBan.Free;

  begin
//  Cursor := crHourGlass;
  try
   if fNewTh.Count>0 then

    for i := fNewTh.Count - 1 downto 0 do
    begin
      if assigned(fNewTh[i]) then
      begin
        tmp:=fNewTh[i];
        TA(fNewTh[i]).Terminate; // terminate thread
        TA(fNewTh[i]).WaitFor; // make sure thread terminates
      end;
    end;
    fNewTh.Clear;
Уже Даже идей нет, что не так.

_____________________________АПД
Если прописать так терминейт, то ошибки нет, но во-первых это бред так делать, а во-вторых объект-то остался.
Код:
procedure TA.Terminate(Sender : TObject);
begin

//Self:=nil;
MainThread.fNewTh.Delete(fIndex);

end;

Последний раз редактировалось nixon232, 01.05.2017 в 14:42.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:01.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter