Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Завершение потока, Как узнать что поток остановлен 
:(
    Опции темы
ZBugz
  Дата 6.1.2010, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Всем привет. Первый раз пользую потоки  smile 
Все работает, потоки - сила.
Но вот столкнулся с такой проблемой, поток пошел в execute, все пашет, жму кнопку, делаеться Terminate указанного потока. Удаляю данные из ячейки,  и меня в ошибку выкидывает.
А выкидывает потому что поток еще не Terminate, а где то TCopyThread.Progress шатаеться...  smile 
Ну и я тут в ступоре, как сделать так, что бы дождаться его Terminate ? smile 
Так пробывал:
Код

try
   CT[StrToInt(Lv.Items[j].SubItems[9])].Terminate;
 finally

Не помогает :(

Тока с примером, если можно, а то для меня потоки это темный лес  smile Учу пока их...
PM MAIL   Вверх
RA
Дата 6.1.2010, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Цитата

Как узнать что поток остановлен


Ну если не вешать всяких своих проверок то по пришествию события OnTerminate.  



А так по сути проблемы не мешало бы код увидеть ...

Это сообщение отредактировал(а) RA - 6.1.2010, 16:12
PM   Вверх
artsb
Дата 6.1.2010, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 6
Всего: 64



ZBugz, вызов метода Terminate не уничтожает поток, а лишь взводит флаг Terminated, который нужно проверять в потоке и если он взведён, завершать его работу.

Ну а проверить завершился ли поток можно функцией GetExitCodeThread. В lpExitCode заносится код завершения потока либо STILL_ACTIVE, если поток ещё работает.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Демо
Дата 7.1.2010, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



ZBugz, 

В реализации Delphi есть метод WaitFor для ожидания завершения поточной функции.
Использовать можно в случае FreeOnTerminate=False;

т.е.

Код

MyThread.WaitFor;
MyThread.Free;


Если нужна периодическая проверка, тогда можно периодически проверять результат функции 
Код

WaitForSingleObject(MyThread.Handle, 0);



--------------------
    
PM MAIL ICQ Skype   Вверх
ZBugz
Дата 8.1.2010, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Народ, я ничего не понял вообще  smile 
Код выложить пока не могу, негде написать пример...
PM MAIL   Вверх
ZBugz
Дата 8.1.2010, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



А в проекте так:
Код

procedure TCopyThread.Execute;
begin
//чето делаем
Application.ProcessMessages;
 if Terminated then
    begin
        break;
     end;
end;
constructor TCopyThread.Create(Suspended: boolean; );
begin
  inherited Create (Suspended);
  LineIndex:= ILineIndex;
  TaskIndex:= ITaskIndex;
end;

И вот где брейк, что то надо делать, что бы ждать когда он завершиться....
Код

TCopyThread.CurrentThread.Terminate; и т.д.
 не катит :(

Добавлено через 1 минуту и 12 секунд
Нажимаею кнопку и передаю
Код

CT[idx].Terminate;

Где idx номер потока котрый грохнуть
PM MAIL   Вверх
artsb
Дата 8.1.2010, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 6
Всего: 64



Код

 if Terminated then
    begin
        // убираемся за собой (удаляем динамически созданные объекты и т.п.)
       exit;
     end;



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
ZBugz
Дата 8.1.2010, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Цитата(artsb @ 8.1.2010,  14:39)
Код

 if Terminated then
    begin
        // убираемся за собой (удаляем динамически созданные объекты и т.п.)
       exit;
     end;

Так все удаляю, ща вот точнее как у меняя там:

Код

procedure TCopyThread.Execute;
begin
  try
//чето делаем
Application.ProcessMessages;
 if Terminated then
    begin
        break;
     end;
  finally
   // а тут я делаю всем free
  if Stream<>nil then FreeAndNil(Stream);
end;

То что free не срабатывает, это я понял давно, точнее он то срабатывает, а поток в это время гуляет TCopyThread.Progress
Мне бы как то это бы отловить бы, что пока он не завершиться, free не делать...
PM MAIL   Вверх
artsb
Дата 8.1.2010, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 6
Всего: 64



Цитата(ZBugz @  8.1.2010,  14:58 Найти цитируемый пост)
if Stream<>nil then FreeAndNil(Stream);

Вы что, пытаетесь уничтожить поток внутри него же?

ИМХО у вас вообще организация неправильная. Что вы хотите сделать вообще? Какова цель?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
ZBugz
Дата 8.1.2010, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Цитата(artsb @ 8.1.2010,  17:08)
Цитата(ZBugz @  8.1.2010,  14:58 Найти цитируемый пост)
if Stream<>nil then FreeAndNil(Stream);

Вы что, пытаетесь уничтожить поток внутри него же?

ИМХО у вас вообще организация неправильная. Что вы хотите сделать вообще? Какова цель?

Не обращайте внимания, это я для примера так написал.
Я смысл хотел передать, что Terminated в Execute срабатывает, в finally выходит вроде, все делаеться, но на самом деле он не звершен  smile 

И еще, я не знаю, поможет или нет, но когда только создаю поток, он успешно рубиться в  Execute, а все синхронайзы(Progress), т.е. вывода информации, как то сначала запаздуют с отображением, а то ка потом вся инфа идет. И точно так же получаеться что он и выходит их  Execute  smile Т.е. с тормозом.

Мне бы какой нить цикл, который ждал бы завершения именно этого потока, а потом уже вываливался в тот же 
Код

if Stream<>nil then FreeAndNil(Stream);


Добавлено через 1 минуту и 23 секунды
Цитата(artsb @ 8.1.2010,  17:08)
Цитата(ZBugz @  8.1.2010,  14:58 Найти цитируемый пост)
if Stream<>nil then FreeAndNil(Stream);

Вы что, пытаетесь уничтожить поток внутри него же?

ИМХО у вас вообще организация неправильная. Что вы хотите сделать вообще? Какова цель?

Кстати, а почему это не прокатит ? Поток потоком, а stream - стримом. Они же не пересекаються никаким способом.... ?!
PM MAIL   Вверх
artsb
Дата 8.1.2010, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 6
Всего: 64



Цитата(ZBugz @  8.1.2010,  19:38 Найти цитируемый пост)
что Terminated в Execute срабатывает, в finally выходит вроде, все делаеться, но на самом деле он не звершен

Terminated  - это флаг, который взводится при вызове метода потока Terminate. При проверке этого флага внутри Execute, можно убраться за собой и выйти из функции (хотя можно и проигнорировать флаг smile), тем самым завершив работу потока. После этого из основного потока можно уничтожить объект отработавшего потока.

Цитата(ZBugz @  8.1.2010,  19:38 Найти цитируемый пост)
И еще, я не знаю, поможет или нет, но когда только создаю поток, он успешно рубиться в  Execute, а все синхронайзы(Progress), т.е. вывода информации, как то сначала запаздуют с отображением, а то ка потом вся инфа идет. И точно так же получаеться что он и выходит их  Execute

ИМХО это из-за синхронизации.

Цитата(ZBugz @  8.1.2010,  19:38 Найти цитируемый пост)
Кстати, а почему это не прокатит ?

Ох. Сори. Я что-то подумал, что это объект потока.

Добавлено через 1 минуту и 3 секунды
А где вы создаёте Stream?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
ZBugz
Дата 8.1.2010, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Цитата(artsb @ 8.1.2010,  21:01)
Terminated  - это флаг, который взводится при вызове метода потока Terminate. При проверке этого флага внутри Execute, можно убраться за собой и выйти из функции (хотя можно и проигнорировать флаг smile), тем самым завершив работу потока. После этого из основного потока можно уничтожить объект отработавшего потока.

Так вот, я делаю все, а оно делаеться, но с опозданием. Т.е. все работает, в 99%, а в оставшемся случае, тупо не успевает уничтажаться.

Добавлено @ 21:19
Цитата

А где вы создаёте Stream?

Прям в Execute.
Вроде как одно другому не мешает smile 

Это сообщение отредактировал(а) ZBugz - 8.1.2010, 21:20
PM MAIL   Вверх
artsb
Дата 8.1.2010, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 6
Всего: 64



Цитата(ZBugz @  8.1.2010,  21:19 Найти цитируемый пост)
Прям в Execute.

Так и уничтожайте там же. После проверки флага Terminated, уничтожте и выходите из функции. Или Stream в это время ещё нужна?

Добавлено через 4 минуты и 21 секунду
Цитата(ZBugz @  8.1.2010,  21:19 Найти цитируемый пост)
Так вот, я делаю все, а оно делаеться, но с опозданием. Т.е. все работает, в 99%, а в оставшемся случае, тупо не успевает уничтажаться.

задержку при старте можно объяснить синхронизацией ИМХО, а вот по поводу того что у вас в конце там тормозит, я так и не понял толком  smile 

Цитата(ZBugz @  8.1.2010,  21:19 Найти цитируемый пост)
Вроде как одно другому не мешает

Ага.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
ZBugz
Дата 9.1.2010, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Цитата

Так и уничтожайте там же. После проверки флага Terminated, уничтожте и выходите из функции. Или Stream в это время ещё нужна?

Не, не нужна. Я ее там же и уничтажаю. Выше в код е написанно, что грохаю все.
Цитата
задержку при старте можно объяснить синхронизацией ИМХО, а вот по поводу того что у вас в конце там тормозит, я так и не понял толком  smile 

smile Я имел ввиду что free во всю делаеться, а поток почему то в синхронайзе(progress) гуляет.
Код

procedure TCopyThread.Execute;
begin
  try
//чето делаем
Application.ProcessMessages;
синхронайз(progress) <-гуляет тут, но...
 if Terminated then
    begin
        break;
     end;
  finally
   // ... на самом деле уже выполняеться или выполнилось free
  if Stream<>nil then FreeAndNil(Stream);
end;

PM MAIL   Вверх
artsb
Дата 9.1.2010, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 6
Всего: 64



Код

// ... на самом деле уже выполняеться или выполнилось free

эм... не верю smile как такое может быть. ИМХО вы что-то не договариваете   smile

Добавлено через 4 минуты и 57 секунд
Т.е. вы хотите сказать, что это работает:
Код

синхронайз(progress) <-гуляет тут, но...

, а Stream уже уничтожен?

Добавлено через 6 минут и 25 секунд
Кстати, у вас в коде проверка Terminated стоит в самом конце. Там от неё толку нет  smile 

Это сообщение отредактировал(а) artsb - 9.1.2010, 10:12


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2139 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.