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

Поиск:

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


Опытный
**


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

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



Цитата

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

Дык вот именно так. Сам в шоке  smile 
Цитата

Т.е. вы хотите сказать, что это работает:
Код

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

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

Ага  smile  Т.е. условие выполняеться->выполнилось, а он гуляет где то. Это дебаггер показывает...
И я вот тут в ступоре, как это отловить...  smile 
Ща одна мысля появилась, потестю пока ее.
Цитата

Кстати, у вас в коде проверка Terminated стоит в самом конце. Там от неё толку нет  smile

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


Эксперт
****


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

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



Странно...
А что у вас в функции "progress"?

Цитата(ZBugz @  9.1.2010,  11:29 Найти цитируемый пост)
Всмысле ? 

Это:
Код

 if Terminated then
    begin
        break;
     end;

стоит в самом конце функции. Какой толк от этого? Циклов у вас не наблюдается. Хотя может вы не весь код привели...


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


Опытный
**


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

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



Цитата

Странно...
А что у вас в функции "progress"?

Там вывод информации, вот он там что то пытаеться вывести того, чего нету уже...
Цитата

Код

 if Terminated then
    begin
        break;
     end;

стоит в самом конце функции. Какой толк от этого? Циклов у вас не наблюдается. Хотя может вы не весь код привели...

Это не весь код, это в середине, а в начале там всякие переменные присваиваються и т.д.
PM MAIL   Вверх
artsb
Дата 9.1.2010, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ZBugz @  9.1.2010,  12:13 Найти цитируемый пост)
Это не весь код

Так давайте весь smile Ну или почти весь.


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


Опытный
**


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

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



Цитата(artsb @ 9.1.2010,  12:20)
Цитата(ZBugz @  9.1.2010,  12:13 Найти цитируемый пост)
Это не весь код

Так давайте весь smile Ну или почти весь.

Ну все тоже самое smile 

Код

procedure TCopyThread.Execute;
begin
  Zader:=TTimer.Create(Mainform);
  Zader.Enabled:=True;
  Zader.OnTimer:=OnTimerProc;
  Zader.Interval:=RefreshR1;
//чето делаем
try
//чето делаем
Application.ProcessMessages;
 if Terminated then
    begin
       zader.Free;      
       break;
     end;
    except
      MyError(Exception(ExceptObject));
    end
  finally
   Synchronize(Stop);
end;

constructor TCopyThread.Create(Suspended: boolean; );
begin
  inherited Create (Suspended);
  LineIndex:= ILineIndex;
end;

procedure TCopyThread.OnTimerProc(Sender: TObject);
begin
  Synchronize(Progress);
end;

procedure TCopyThread.Progress;
begin
// чето делаем
end;

Synchronize(Progress) идет через таймер, что бы ниче при отображении не мигало. Я подозреваю его, хотя что free, что destroy, пофигу, все равно отрабатывает Synchronize(Stop), а в то же время поток еще Synchronize(Progress)

Добавлено через 6 минут и 3 секунды
Причем щас прошелся еще раз дебагером, выходит Synchronize(Stop), все там делает, а потом как все там прошел, уходит в Synchronize(Progress)  smile 

Это как ?  smile 

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


Эксперт
****


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

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



ИМХО лучше так:
Код

  Zader.OnTimer:=OnTimerProc;
  Zader.Interval:=RefreshR1;
 Zader.Enabled:=True; // <- сюда

И что-то не видно Stream...


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


Опытный
**


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

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



Цитата

ИМХО лучше так:
Код

  Zader.OnTimer:=OnTimerProc;
  Zader.Interval:=RefreshR1;
 Zader.Enabled:=True; // <- сюда


Ну да, чето не заметил smile
Цитата

И что-то не видно Stream...
А там другое. Это как пример был.
PM MAIL   Вверх
artsb
Дата 9.1.2010, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ZBugz @  9.1.2010,  13:55 Найти цитируемый пост)
А там другое. Это как пример был. 


ZBugz, ты меня запутал smile Покажи плиз кусок с ошибкой и опиши что именно не так. Ну или выложи проект...


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


Опытный
**


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

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



Цитата(artsb @ 9.1.2010,  14:38)
Цитата(ZBugz @  9.1.2010,  13:55 Найти цитируемый пост)
А там другое. Это как пример был. 


ZBugz, ты меня запутал smile Покажи плиз кусок с ошибкой и опиши что именно не так. Ну или выложи проект...

Дык нету ошибки явной. 
Смысл вот в чем, все работает, берешь удаляешь данные из ячейки listview, передаю терминэйт, а так как уже после терминэйт все free, то вывод данных в ячейку падает в ошибку.... Их брать то уже негде... smile Уже все free сделали и пропали, а поток при этом все хочет инфу вывести на VCL компонет.

Кстати, почитал я, так вот, такое часто, к примеру, при копировании файла. Так вот у меня именно тоже самое что и тут http://forum.vingrad.ru/forum/topic-60076/...ry480375/0.html
Тока в этой статье ничерта не понятно как реализовать остановку  smile 
PM MAIL   Вверх
ZBugz
Дата 9.1.2010, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тут пришел мой начальник smile И сказал, что делать таймер в потоке, это бред, потому что таймер в потоках живет криво. Это я уберу, у меня так и так было без таймера в свое время...
Далее, кое че подправил, читая статью про потоки, все почти работает. Смысл в том что действительно, делая файловые операции в потоки, это жесть, в плане отловки закрытия файлов, поток потоком, а файловые операции, это лперации... Ими управляет система.
PM MAIL   Вверх
Демо
Дата 9.1.2010, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(ZBugz @  9.1.2010,  19:52 Найти цитируемый пост)
Тут пришел мой начальник  И сказал, что делать таймер в потоке, это бред, потому что таймер в потоках живет криво. 


Это не бред, и живёт таймер в потоках весьма хорошо. Бред - эта цитата.

Вот Application.ProcessMrssages в потоках - это явный бред, используется лишь с целью исправить ошибки проектирования и реализации, внося в приложение элемент непридсказуемости поведения и увеличивая количество глюков.

>Автор

Как я выше написал, чтобы дождаться окончания выполнения поточной функции, в Delphi есть метод TThread.WaitFor.

Твоя нить  при установке флага Terminated должна немедленно закончить работу.
Непонятно, в чём у тебя проблема.

Цитата(ZBugz @  9.1.2010,  12:50 Найти цитируемый пост)
Synchronize(Progress) идет через таймер, что бы ниче при отображении не мигало. Я подозреваю его, хотя что free, что destroy, пофигу, все равно отрабатывает Synchronize(Stop), а в то же время поток еще Synchronize(Progress)Добавлено через 6 минут и 3 секундыПричем щас прошелся еще раз дебагером, выходит Synchronize(Stop), все там делает, а потом как все там прошел, уходит в Synchronize(Progress)   Это как ?   


А не судьба проверить установку флага Terminated везде, где это может повлиять на работу приложения?


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


Опытный
**


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

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



Цитата

Это не бред, и живёт таймер в потоках весьма хорошо. Бред - эта цитата.

Значит таймер может быть рожденный в потоке и жить хорошо ?

Цитата

Вот Application.ProcessMrssages в потоках - это явный бред, используется лишь с целью исправить ошибки проектирования и реализации, внося в приложение элемент непридсказуемости поведения и увеличивая количество глюков.

А как тогда быть ? Вообще убрать ?
Цитата

Как я выше написал, чтобы дождаться окончания выполнения поточной функции, в Delphi есть метод TThread.WaitFor.

Я не пойму как ее использовать  smile 
Цитата

Твоя нить  при установке флага Terminated должна немедленно закончить работу.
Непонятно, в чём у тебя проблема.

Так она и вроде как и заканчивает работу.
Цитата

А не судьба проверить установку флага Terminated везде, где это может повлиять на работу приложения?

Я сделал это, в одном месте (проверку в TCopyThread.Progress, все хорошо), но проблема именно в том, что сам windows не успевает закрыть файлы или ему антивирус мешает и т.д. , поэтому получаеться что я пытаюсь открыть еще не закрытый файл...
PM MAIL   Вверх
Демо
Дата 10.1.2010, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(ZBugz @  10.1.2010,  13:22 Найти цитируемый пост)
Значит таймер может быть рожденный в потоке и жить хорошо ?


Вполне;)


Цитата(ZBugz @  10.1.2010,  13:22 Найти цитируемый пост)
А как тогда быть ? Вообще убрать ?


ни в коем случае не используй эту функцию в дополнительных потоках.


Цитата(ZBugz @  10.1.2010,  13:22 Найти цитируемый пост)
Я не пойму как ее использовать 


Вот смотри:

В реализации TThread устанавливаешь FreeOnTerminated := False;

В коде, где у тебя нужно дождаться завершения потока:

Код

MyThread.WaitFor;
MyThread.Free;


После выполнения этого кода у тебя гарантированно отработал деструктор потока.


Цитата(ZBugz @  10.1.2010,  13:22 Найти цитируемый пост)
Я сделал это, в одном месте (проверку в TCopyThread.Progress, все хорошо), но проблема именно в том, что сам windows не успевает закрыть файлы или ему антивирус мешает и т.д. , поэтому получаеться что я пытаюсь открыть еще не закрытый файл...



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


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


Эксперт
****


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

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



Цитата(Демо @  10.1.2010,  13:42 Найти цитируемый пост)
В коде, где у тебя нужно дождаться завершения потока:


Демо, ZBugz хочет сделать эту проверку в самом потоке (в функции Execute), если я правильно понял  smile 
Ну и это
Код

MyThread.Free;

Будет там не в тему.

Если честно, я до сих пор не могу понять что и где работает не так  smile 


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


Эксперт
***


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

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



Цитата(artsb @  10.1.2010,  14:12 Найти цитируемый пост)
Демо, ZBugz хочет сделать эту проверку в самом потоке (в функции Execute), если я правильно понял   Ну и этокод Pascal/Delphi1:MyThread.Free;highlightSyntax('delphi_NGZkMW','delphi');Будет там не в тему.


Дык перечитай топик-)
Terminate для завершения потока и используется.


Цитата(artsb @  10.1.2010,  14:12 Найти цитируемый пост)
Если честно, я до сих пор не могу понять что и где работает не так  


У автора секретная программа smile 


--------------------
    
PM MAIL ICQ Skype   Вверх
Страницы: (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.0616 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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