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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наблюдение за изменениями файлов на flash'ках 
V
    Опции темы
snakesoft
  Дата 2.8.2013, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 26.5.2007

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



Всем привет!
Пишу утилиту для наблюдения за изменениями на подключенных съемных устройствах

Столкнулся с такой проблемой.
Если запустить программу, подключить одну флэшку скопировать например на нее несколько файлов, затем подключить еще одну флэшку, выполнить те же самые действия со второй флэшкой, далее извлечь первую то после перечисленных действий программа слегка подвисает, но продолжает фиксировать все дальнейшие изменения на флэшках

Подозреваю, что проблема не в совсем корректном завершении потока в:

Код


procedure TForm1.WMDeviceChange(var Msg: TMessage);

...
  FileChanges[i].Terminate;
  FileChanges[i].WaitFor;
  FileChanges[i].Free;
...

end;


Если использовать

Код


procedure TForm1.WMDeviceChange(var Msg: TMessage);

...
  FileChanges[i]:=nil;
...

end;


Все работает нормально и подвисаний у программы нет, но в этом случае как я понимаю я не освободил память потока....

Помогите пожалуйста решить проблему, исходник прилагается




Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  flash.rar 15,48 Kb
PM MAIL   Вверх
Чучмек
Дата 2.8.2013, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Цитата(snakesoft @  2.8.2013,  17:45 Найти цитируемый пост)
  FileChanges[i].WaitFor;

Вот здесь и подвисает. Ждет пока поток отработает.
FreeOnTerminate

Добавлено через 3 минуты и 30 секунд
p.s. Возможно неправильно организованна остановка потока.



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Чучмек
Дата 3.8.2013, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



snakesoft, посмотрел твой код.
Твоя проблема в ReadDirectoryChangesW.
Эта функция,ожидающая изменений в каталоге, не возвращает управление после отключения флешки.
Отсюда и зависание   WaitFor, в основном потоке, ждет завершения  потока TFileThread, а тот в свою очередь висит на  ReadDirectoryChangesW.
Вариантов исправить это несколько.
1. Использовать ReadDirectoryChangesW в асинхронном режиме, тогда дополнительные потоки вообще не нужны.
2. Убивать поток через TerminateThread
3. либо ... еще незнаю, надо смотреть.


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
snakesoft
Дата 5.8.2013, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 26.5.2007

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



Спасибо, что помог!
Попробовал

Код

TerminateThread (FileChanges[i].Handle, 0);
FileChanges[i].Free();


Всё ок
PM MAIL   Вверх
MetalFan
Дата 6.8.2013, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Цитата(Чучмек @  3.8.2013,  13:48 Найти цитируемый пост)
2. Убивать поток через TerminateThread

Не очень хороший вариант, имхо.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Чучмек
Дата 6.8.2013, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Цитата(MetalFan @  6.8.2013,  14:31 Найти цитируемый пост)
Не очень хороший вариант, имхо. 

Но зато не требует серьезной переделки программы.
А вообще да, надо найти способ раздуплить ReadDirectoryChanges.
Асинхронный вариант тоже, по моему, не решает всего. Будет время - проверю.



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Illusion Dolphin
Дата 6.8.2013, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

А вообще да, надо найти способ раздуплить ReadDirectoryChanges.

У меня работает оно так: отдельный поток,

Код

var
  FOverLapp: TOverlapped;

...
FCompletionPort := CreateIoCompletionPort(Handle, 0, CompletionKey, 0);
...
ReadDirectoryChanges(бла-бла,  @FOverLapp, nil)
...
GetQueuedCompletionStatus(CompletionPort,
    lpNumberOfBytesTransferred,
    lpCompletionKey, lpOverlapped, INFINITE);
...
//И когда надо отменить операцию:
PostQueuedCompletionStatus(CompletionPort, 0, 0, nil);
 
Вроде работает стабильно, без задержек. 


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Чучмек
Дата 7.8.2013, 12:26 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Illusion Dolphin да, это один из вариантов.
Я пытался присобачить порт завершения, но ...
Нормального русскоязычного описания функций не нашел, а в англицкой тарабарщине, от меня, смысл, порой, ускользает. 
Да и не уверен был что поможет, поэтому не старался.
Illusion Dolphin спасибо, подтолкнул в нужном направлении.


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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