Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Внимание: в папку C:\temp скопирован файл

293
29 февраля 2004 года
SEDEGOFF
586 / / 06.10.2002
поскажите пожалуйста, как узнать (постоянно не сканируя), что в определенную папку был скопирован файл. Насколько я понимаю винда посылает всем процесса какое то сообщение. Какое?
1
29 февраля 2004 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by SEDEGOFF
поскажите пожалуйста, как узнать (постоянно не сканируя), что в определенную папку был скопирован файл. Насколько я понимаю винда посылает всем процесса какое то сообщение. Какое?


Возможно тебе помогут функции FileIOCompletionRoutine, MsgWaitForMultipleObjectsEx и WaitForMultipleObjectsEx посмотри их описание в MSDN.

293
01 марта 2004 года
SEDEGOFF
586 / / 06.10.2002
Спасибо, но не то
293
01 марта 2004 года
SEDEGOFF
586 / / 06.10.2002
Спасибо, но не то
1.9K
01 марта 2004 года
ILS
100 / / 28.01.2003
FindFirstChangeNotification
(в NT функций поболее, но и в Win98 работает)
293
01 марта 2004 года
SEDEGOFF
586 / / 06.10.2002
Когда запускаю цикл на опрос - все равно программа забирает на себя все ресурсы, а мне надо чтобы оно спало, пока что нибудь не случиться
1.9K
01 марта 2004 года
ILS
100 / / 28.01.2003
Цитата:
Originally posted by SEDEGOFF
Когда запускаю цикл на опрос - все равно программа забирает на себя все ресурсы, а мне надо чтобы оно спало, пока что нибудь не случиться


Дык и не надо цикл запускать. Зарегестрировал в системе каталог, зва ктрм тебе нужно следить, подал ей свою функцию - система ее и вызовет - когда пройзойдут изменения.

вот пример моего "базового" класса
(функция SayAboutChange переопределяется для каждой конкретной реализации)


//---------------------------------------------------------------------------
void __fastcall TDirChange::Execute()
{
if(path=="-") Terminate();//!!!

HANDLE hSubstDirChange= FindFirstChangeNotification(path.c_str(),subTree,flag);
if(hSubstDirChange!=INVALID_HANDLE_VALUE)
{ while(!Terminated)
{ WaitForSingleObject(hSubstDirChange,INFINITE);
Synchronize(SayAboutChange);
FindNextChangeNotification(hSubstDirChange);
}
FindCloseChangeNotification(hSubstDirChange);
}
else { DWORD er=GetLastError();
char buf[256];
er=FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM,//0,// DWORD dwFlags, // source and processing options
NULL,// LPCVOID lpSource, // pointer to message source
er,// DWORD dwMessageId, // requested message identifier
0,// DWORD dwLanguageId, // language identifier for requested message
buf,// LPTSTR lpBuffer, // pointer to message buffer
255,// DWORD nSize, // maximum size of message buffer
NULL// va_list *Arguments // address of array of message inserts
);
ShowMessage("Ошибка потока "+path+":\n"+AnsiString(buf));
}
Terminate();
}

293
01 марта 2004 года
SEDEGOFF
586 / / 06.10.2002
Спасибо большое
293
02 марта 2004 года
SEDEGOFF
586 / / 06.10.2002
Да вот еще проблема - почему уведомление приходит дважды. То есть обработчик срабатывает 2 раза
1.9K
02 марта 2004 года
ILS
100 / / 28.01.2003
Цитата:
Originally posted by SEDEGOFF
Да вот еще проблема - почему уведомление приходит дважды. То есть обработчик срабатывает 2 раза


У меня такой проблемы нет.
Посмотри внимательнее на флаги функции FindFirstChangeNotification (каталог/подкаталоги и т.п.) - возможно происходит событие,ктр "узнается" по нескольким критериям - соответственное кол-во раз и обработчик дергается...

293
02 марта 2004 года
SEDEGOFF
586 / / 06.10.2002
У меня стоит один флаг FILE_NOTIFY_CHANGE_LAST_WRITE.
Но проблему я решил
Вместо

FindNextChangeNotification(hSubstDirChange);

пишу
FindNextChangeNotification(hSubstDirChange);
FindNextChangeNotification(hSubstDirChange);
и все
293
07 марта 2004 года
SEDEGOFF
586 / / 06.10.2002
А как сказать этой функции что бы она перестала ждать и при этом ничего не делать с наблюдаемой папкой. А то я не могу остановить сервис
1.9K
09 марта 2004 года
ILS
100 / / 28.01.2003
Цитата:
Originally posted by SEDEGOFF
А как сказать этой функции что бы она перестала ждать и при этом ничего не делать с наблюдаемой папкой. А то я не могу остановить сервис


Не знаю как ты инициализируешь это все. Я же, если ты заметил по коду, использую это все в отдельном Thread-е, соответственно и юзаю функции ТThread-а:
Terminate() и Suspend()

293
10 марта 2004 года
SEDEGOFF
586 / / 06.10.2002
У меня это тоже все в отдельном потоке. Поток запускаеться из сервиса. Так вот я заметил - что с помощбю винды не могу остановить свой сервис. При отладке обнаружил что поток стоит и слушает папку. Если удаляю объект потока, то удаления не происходит пока что нибудь не произойдет в папке. Что за фигня может быть - незнаю. До этого при удалении работающего потока генерировалось исключение, а тут стоит и ждет
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог