![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Illusion Dolphin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
У меня для слежениями за изменениями в файловой системе используется функция ReadDirectoryChangesW, которую я вызываю в отдельном потоке. Но она следит за определённой папкой, а если нужно следить за другой папкой, то я создаю новый поток уже с нужными параметрами. Тут и возникает вопрос: как правильно остановить ненужный поток, если функция ReadDirectoryChangesW в потоке останавливает его выполнение на этом месте (до сообщения об изменении)? Еси делать terminatethread, то память, выделенная под переменные будет утеряна, а этого бы не хотелось...
Функция определена так:
Что это за последний параметр lpCompletionRoutine? Может, как-нибудь можно корректно прервать выполнение этой функции чтобы нормально остановить? -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
Vex |
|
||||
![]() кацапосрачмученiкъ ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3103 Регистрация: 28.3.2002 Где: strawberry fields Репутация: 1 Всего: 88 |
Что это за последний параметр lpCompletionRoutine?
Английским не владею, но это, ИМХО, указатель на поток, который вызывает эту функцию.
используй метод потока Suspend, для продолженя работы потока - Resume. -------------------- Слава Україні. |
||||
|
|||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 15 Всего: 98 |
Vex
немного не так ![]() это функция, вызываемая по завершению или отмене операции для правильной остановки придется заполнять lpOverlapped ( для перехода в асинхронный режим ) и внутри потока следить за переменной, переданной в поток ( она бдет индикатором для потока, говорящему пора ли выходить ) -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
Illusion Dolphin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
А подробнее нельзя ![]() -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 15 Всего: 98 |
насчет подробнее могу посоветовать прочитать статью Serial Communications" на MSDN' e -- там хорошо написанно про синхронные / асинхронные операции
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
Illusion Dolphin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
_hunter: проблема не в синхронных / асинхронных операциях, а в понимании строки: "внутри потока следить за переменной, переданной в поток". Если я заполню структуру правильно для асинхронного режима, то процедура будет действовать асинхронно? Я правильно понимаю? Но тогда как мне узнавать, что она выполнилась? Будет вызываться процедура, адрес которой передаётся последним параметром? А как её (процедуру) тогда ПРЕРВАТЬ?
-------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
<Spawn> |
|
||||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Illusion Dolphin
-------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
||||
|
|||||
Illusion Dolphin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Гм... Я так передам виндовсу указатель на свою процедуру, и что с этого??? Что мне делать с SomeProc когда я хочу прервать ReadDirectoryChangesW ![]() -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 25 Всего: 55 |
Вообщето, ReadDirectoryChangesW не доступна в Win9x, но для кого-то это и не важно.
Лично я, обычно для подобных целей использую FindFirstChangeNotification/FindNextChangeNotification/FindCloseChangeNotification, они доступны начиная с Win95. Но, FindNextChangeNotification лишь уведомляет о том что были ожидаемые изменения, ничего не сообщая о том какие именно. Поэтому, приходится хранить текущее состояние каталога в списке. Если интересно, могу кинуть исходник из собственной библиотеки. -------------------- Все знать невозможно, но хочется |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 15 Всего: 98 |
эта функция служит не для остановки!!!
в цикле потока ты вызываеш ReadDirectoryChangesW в асинхронном режиме изменения ты будеш получать в буффер:
об ошибке будет говорить нулевое возвращенное значение -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
Illusion Dolphin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Петрович: А мне нужно знать, что именно произошло, иначе каряво выходит :/
_hunter: Сейчас с вызываю её в синхронном режиме в отдельном потоке и как только процедура выполниться - считываю данные... Если я запущу её в асинхронном режиме, то... по SomeProc я буду получать уведомление о том, что что-то произошло? А если я прерву нить, то что будет с этой процедурой? Я при прекращени нити должен выгрузить буфер, а в процедуру передан указатель на него... Не будет ли волникать ошибка из-за этого? -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 15 Всего: 98 |
стоп... я думал тебе постоянно следить нужно
тогда после считывания данных освобождай пмять, выделенную под буффера, ... и смело делай TeminateThread(GetCurrentThread(), 0) -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
Illusion Dolphin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Хм... В то-то и приблема, что если в папке не будет ничего происходить, то и до считывания дело не дойдёт! На этой функции выполнение нии останавливается то того момента, пока что-то не произошло! Я вот думаю: если в главный поток передавать указатель на буфер, который используется в нити и делать сначала TeminateThread, а потом освобождать буфер у нити - так вообще делать можно ![]() -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 25 Всего: 55 |
А ты не пробовал из убивающего потока сделать CloseHandle для хендла переданного в синхронно вызванный ReadDirectoryChangesW. Думаю что после этого ReadDirectoryChangesW "вывалится" с ошибкой, и поток сможет самостоятельно завершиться. -------------------- Все знать невозможно, но хочется |
|||
|
||||
Illusion Dolphin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Петрович
Хм 8) А это идея! Надо попробовать... -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |