Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

FindFirstChangeNotification FindNextChangeNotification FindCloseChangeNotification

Уведомление об изменении файловой системы

Функция WaitForlnputldle

Асинхронный ввод-вывод на устройствах

При асинхронном вводе-выводе поток начинает операцию чтения или записи и не ждет ее окончания. Например, если потоку нужно загрузить в память большой файл, он может сообщить системе сделать это за него. И пока система грузит файл в память, поток спокойно занимается другими задачами — создает окна, инициализирует внутренние структуры данных и т. д. Закончив, поток приостанавливает себя и ждет уведомления от системы о том, что загрузка файла завершена.

Объекты устройств являются синхронизируемыми объектами ядра, а это означает, что Вы можете вызывать WaitForSingleObject и передавать ей описатель какого-либо файла, сокета, коммуникационного порта и т. д. Пока система выполняет асинхрон ный ввод-вывод, объект устройства пребывает в занятом состоянии. Как только операция заканчивается, система переводит объект в свободное состояние, и поток узнает о завершении операции. С этого момента поток возобновляет выполнение.

Поток может приостановить себя и вызовом WaitForlnputIdle:

DWORD WaitForInputIdle(HANDLE hProcess, DWORD dwMilliseconds);

Эта функция ждет, пока у процесса, идентифицируемого описателем bProcess, не опустеет очередь ввода в потоке, создавшем первое окно приложения. WaitForlnputldle полезна для применения, например, в родительском процессе, который порождает дочерний для выполнения какой-либо нужной ему работы. Когда один из потоков родительского процесса вызывает CreateProcess, он продолжает выполнение и в то время, пока дочерний процесс инициализируется. Этому потоку может понадобиться описатель окна, создаваемого дочерним процессом. Единственная возможность узнать о моменте окончания инициализации дочернего процесса — дождаться, когда тот прекратит обработку любого ввода. Поэтому после вызова CreateProcess поток родительского процесса должен вызвать WaitForInputIdle.

Функция FindFirstChangeNotification создаёт описатель объекта ядра "уведомление", с помощью которого можно отслеживать заданные фильтром изменения в директории или её поддереве. При выполнении заданного условия (например, появления новых файлов, переименования файлов, изменение их размеров или аттрибутов и т.п.) объект приходит в сигнальное состояние, что можно отследить какой-нибудь wait-функцией. После первого изменения можно продолжить ожидание (т.е. по сути вернуть "уведомление" в несигнальное состояние и направить к ожиданию изменений) с помощью функции FindNextChangeNotification. После завершения слежения необходимо вызывать функцию FindCloseChangeNotification, чтобы освободить объект ядра "уведомление".

HANDLE FindFirstChangeNotification(
LPCTSTR lpPathName, //Путь к директории, изменения в которой будут отслеживаться
BOOL bWatchSubtree, //Флаг, указывающий просматривать ли поддерево каталога
DWORD dwNotifyFilter //Фильтр, т.е указание, что именно отслеживать
);

BOOL FindNextChangeNotification(
HANDLE hChangeHandle //Описатель "уведомления", полученный из предыдущей функции
);

BOOL FindCloseChangeNotification(
HANDLE hChangeHandle //Описатель "уведомления"
);

Рассмотрим подробнее некоторые параметры функции FindFirstChangeNotification:
dwNotifyFilter - в этом параметре можно указать одну из определённого списка констант или и комбинацию, если фильтров требуется наложить несколько. Это могут быть следующие константы: FILE_NOTIFY_CHANGE_FILE_NAME, FILE_NOTIFY_CHANGE_DIR_NAME, FILE_NOTIFY_CHANGE_ATTRIBUTES, FILE_NOTIFY_CHANGE_SIZE, FILE_NOTIFY_CHANGE_LAST_WRITE, FILE_NOTIFY_CHANGE_SECURITY.

Пример:

HANDLE hNotification= FindFirstChangeNotification(g_strInFolder, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME); //Начинаем отслеживать изменения в заданной папке посредством специальной функции
if (hNotification==INVALID_HANDLE_VALUE) //Если создать описатель не удалось, значит заданного пути не существует
{
MessageBox (NULL, "Wrong path", "Error", MB_OK);
return -1;
}
HANDLE pHandles[2]; //Объявляем массив описателей для функции WaitForMultipleObjects
pHandles[0]= g_hStopEvent; //Одним элементом будет событие (нажатие кнопки "стоп")
pHandles[1]= hNotification; //Другим - наш описатель, отслеживающий изменения в папке
while(1) //Бесконечный цикл
{
DWORD dwResult= WaitForMultipleObjects(2, pHandles, FALSE, INFINITE); //Ждём
if (dwResult==WAIT_OBJECT_0) //Нажата кнопка "стоп" - выходим из цикла
break;
//...
FindNextChangeNotification(hNotification); //И включаем ожидание следующего изменения в папке
}//while (1)
FindCloseChangeNotification(hNotification);

 

В следующей таблице суммируются сведения о различных объектах ядра применительно к синхронизации потоков.

Объект Находится в занятом состоянии, когда Переходит в свободное состояние, когда Побочный эффект успешного ожидания
Процесс Поток процесс еще активен поток еще активен процесс завершается (ExitProcess, TerminateProcess) поток завершается (ExitThread, TerminateThread) Нет Нет
Объект Находится в занятом состоянии, когда: Переходит в свободное состояние, когда: Побочный эффект успешного ожидания
Задание время, выделенное заданию, еще не истекло время, выделенное заданию, истекло Нет
Файл выдан запрос на ввод-вывод завершено выполнение запроса на ввод-вывод Нет
Консольный ВВОД ввода нет ввод есть Нет
Уведомление об изменении файла в файловой системе нет изменений файловая система обнаруживает изменения Сбрасывается в исходное состояние
Событие с автосбросом   вызывается SetEvent или PulseEvent Сбрасывается в исходное состояние
Событие со сбросом вручную вызывается ResetEvent или PulseEvent вызывается SetEvent или PulseEvent Нет
Ожидаемый таймер с автосбросом вызывается CancelWaitable- Тiтеr или ожидание успешно завершилось наступает время срабатывания (SetWaitableTimer) Сбрасывается в исходное состояние
Ожидаемый таймер со сбросом вручную вызывается CancelWaitableTimer наступает время срабатывания (SetWaitableTimef) Нет
Семафор ожидание успешно завершилось счетчик > 0 (ReleaseSemaphore) Счетчик уменьшается на 1
Мьютекс ожидание успешно завершилось поток освобождает мьютекс (ReleaseMutex) Передается пото ку во владение
Критическая секция (поль зовательского режима) ожидание успешно завершилось ((Try)EnterCriticalSection) поток освобождает критическую секцию (LeaveCriticalSection) Передается потоку во владение

 

<== предыдущая лекция | следующая лекция ==>
Ожидаемые таймеры | Информационной безопасности
Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 1454; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.