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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Правильно остановить поток... 
:(
    Опции темы
Illusion Dolphin
  Дата 19.6.2004, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



У меня для слежениями за изменениями в файловой системе используется функция ReadDirectoryChangesW, которую я вызываю в отдельном потоке. Но она следит за определённой папкой, а если нужно следить за другой папкой, то я создаю новый поток уже с нужными параметрами. Тут и возникает вопрос: как правильно остановить ненужный поток, если функция ReadDirectoryChangesW в потоке останавливает его выполнение на этом месте (до сообщения об изменении)? Еси делать terminatethread, то память, выделенная под переменные будет утеряна, а этого бы не хотелось...
Функция определена так:
Код

function ReadDirectoryChangesW(hDirectory: THandle; lpBuffer: Pointer;
 nBufferLength: DWORD; bWatchSubtree: Bool; dwNotifyFilter: DWORD;
 lpBytesReturned: LPDWORD; lpOverlapped: POverlapped;
 lpCompletionRoutine: FARPROC): BOOL; stdcall;

Что это за последний параметр lpCompletionRoutine? Может, как-нибудь можно корректно прервать выполнение этой функции чтобы нормально остановить?


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


кацапосрачмученiкъ
****


Профиль
Группа: Экс. модератор
Сообщений: 3103
Регистрация: 28.3.2002
Где: strawberry fields

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



Что это за последний параметр lpCompletionRoutine?

Цитата

lpCompletionRoutine
[in] Pointer to a completion routine to be called when the operation has been completed or canceled and the calling thread is in an alertable wait state. For more information about this completion routine, see FileIOCompletionRoutine.


Английским не владею, но это, ИМХО, указатель на поток, который вызывает эту функцию.

Цитата

Тут и возникает вопрос: как правильно остановить ненужный поток, если функция ReadDirectoryChangesW в потоке останавливает его выполнение на этом месте (до сообщения об изменении)? Еси делать terminatethread, то память, выделенная под переменные будет утеряна, а этого бы не хотелось...


используй метод потока Suspend, для продолженя работы потока - Resume.


--------------------
Слава Україні.
PM   Вверх
_hunter
Дата 19.6.2004, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



Vex
немного не так smile.gif
это функция, вызываемая по завершению или отмене операции

для правильной остановки придется заполнять lpOverlapped ( для перехода в асинхронный режим ) и внутри потока следить за переменной, переданной в поток ( она бдет индикатором для потока, говорящему пора ли выходить )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Illusion Dolphin
Дата 19.6.2004, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата
для правильной остановки придется заполнять lpOverlapped ( для перехода в асинхронный режим ) и внутри потока следить за переменной, переданной в поток

А подробнее нельзя sad.gif?


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


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



насчет подробнее могу посоветовать прочитать статью Serial Communications" на MSDN' e -- там хорошо написанно про синхронные / асинхронные операции


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Illusion Dolphin
Дата 19.6.2004, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



_hunter: проблема не в синхронных / асинхронных операциях, а в понимании строки: "внутри потока следить за переменной, переданной в поток". Если я заполню структуру правильно для асинхронного режима, то процедура будет действовать асинхронно? Я правильно понимаю? Но тогда как мне узнавать, что она выполнилась? Будет вызываться процедура, адрес которой передаётся последним параметром? А как её (процедуру) тогда ПРЕРВАТЬ?


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


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



Illusion Dolphin
Цитата
А как её (процедуру) тогда ПРЕРВАТЬ?


Код
ReadDirectoryChangesW(...., @SomeProc)



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


Эксперт
***


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

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



Цитата
Код
ReadDirectoryChangesW(...., @SomeProc)

Гм... Я так передам виндовсу указатель на свою процедуру, и что с этого??? Что мне делать с SomeProc когда я хочу прервать ReadDirectoryChangesW butbut.gif?


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


Эксперт
***


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

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



Вообщето, ReadDirectoryChangesW не доступна в Win9x, но для кого-то это и не важно.
Лично я, обычно для подобных целей использую FindFirstChangeNotification/FindNextChangeNotification/FindCloseChangeNotification, они доступны начиная с Win95.
Но, FindNextChangeNotification лишь уведомляет о том что были ожидаемые изменения, ничего не сообщая о том какие именно. Поэтому, приходится хранить текущее состояние каталога в списке.
Если интересно, могу кинуть исходник из собственной библиотеки.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
_hunter
Дата 19.6.2004, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



эта функция служит не для остановки!!!

в цикле потока ты вызываеш ReadDirectoryChangesW в асинхронном режиме
изменения ты будеш получать в буффер:
Цитата
When you first call ReadDirectoryChangesW, the system allocates a buffer to store change information. This buffer is associated with the directory handle until it is closed and its size does not change during its lifetime. Directory changes that occur between calls to this function are added to the buffer and then returned with the next call.


об ошибке будет говорить нулевое возвращенное значение


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Illusion Dolphin
Дата 19.6.2004, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Петрович: А мне нужно знать, что именно произошло, иначе каряво выходит :/
_hunter: Сейчас с вызываю её в синхронном режиме в отдельном потоке и как только процедура выполниться - считываю данные... Если я запущу её в асинхронном режиме, то... по SomeProc я буду получать уведомление о том, что что-то произошло? А если я прерву нить, то что будет с этой процедурой? Я при прекращени нити должен выгрузить буфер, а в процедуру передан указатель на него... Не будет ли волникать ошибка из-за этого?



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


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



стоп... я думал тебе постоянно следить нужно
тогда после считывания данных освобождай пмять, выделенную под буффера, ...
и смело делай TeminateThread(GetCurrentThread(), 0)



--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Illusion Dolphin
Дата 20.6.2004, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата
тогда после считывания данных освобождай пмять, выделенную под буффера, ...
и смело делай TeminateThread(GetCurrentThread(), 0)

Хм... В то-то и приблема, что если в папке не будет ничего происходить, то и до считывания дело не дойдёт! На этой функции выполнение нии останавливается то того момента, пока что-то не произошло! Я вот думаю: если в главный поток передавать указатель на буфер, который используется в нити и делать сначала TeminateThread, а потом освобождать буфер у нити - так вообще делать можно biggrin.gif?


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


Эксперт
***


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

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



Цитата
Я вот думаю: если в главный поток передавать указатель на буфер, который используется в нити и делать сначала TeminateThread, а потом освобождать буфер у нити - так вообще делать можно ?

А ты не пробовал из убивающего потока сделать CloseHandle для хендла переданного в синхронно вызванный ReadDirectoryChangesW. Думаю что после этого ReadDirectoryChangesW "вывалится" с ошибкой, и поток сможет самостоятельно завершиться.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Illusion Dolphin
Дата 20.6.2004, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Петрович
Цитата
сделать CloseHandle для хендла переданного в синхронно вызванный

Хм 8) А это идея! Надо попробовать...



--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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