Страница: 1 | 2 | 3 |
Вопрос: Реагировать на запись в файл
Добавлено: 19.01.06 16:41
Автор вопроса: Max
Ответы
Всего ответов: 37
Номер ответа: 16
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #16
Добавлено: 22.01.06 13:02
какие таймеры, какие FileLen?
Специально для уведомления об изменениях есть FindFirstChangeNotification и FindNextChangeNotification и WaitForMultipleObjects
Номер ответа: 17
Автор ответа:
Max
Вопросов: 12
Ответов: 17
Профиль | | #17
Добавлено: 22.01.06 17:02
HOOLIGAN
попробовал - то что надо
большое спасибо !
Номер ответа: 18
Автор ответа:
Max
Вопросов: 12
Ответов: 17
Профиль | | #18
Добавлено: 23.01.06 11:13
HOOLIGAN
вот только нюанс один.
WaitForMultipleObjects подвешивает программу, а мне надо, чтобы параллельно с ожиданием можно было бы еще что-то делать.
есть какие-то еще варианты, как ждать ответа ?
Номер ответа: 19
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #19
Добавлено: 23.01.06 12:21
Запустить в параллельном потоке
А вообще функции типа WaitFor и MsgWaitFor тут не слишком уместны, т.к. используются для синхронизации, а тут нужно немного другое.
Можно, конечно, хуки вешать, но, ИМХО, оно того не стоит...
Номер ответа: 20
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #20
Добавлено: 23.01.06 12:30
WaitForMultipleObjects практически всегда используется в отдельном потоке, чтобы не тормозить основной.
Схема:
в dll пишешь 2 процедуры: первая вызывается из vb-проги и принимает параметр - имя файла. Эта же процедура запускает отдельным потоком вторую процедуру, которая делает FindFirstChangeNotification и ждет WaitForMultipleObjects. Как только WaitForMultipleObjects сработала, вторая процедура сообщает тебе в vb-прогу, что файл изменился. Все. WaitForMultipleObjects запущен в отдельном потоке, и может висеть, сколько ему надо, основная прога не будет его ждать и морозиться.
Либо можешь по vb-шному: непрерывно клацать таймером, делать циклы с DoEvents, нагружающие проц и т.д. При этом выполняя каждый раз кучу бесполезных операций.
Номер ответа: 21
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #21
Добавлено: 23.01.06 12:33
Кстати, о неуместности WaitForMultipleObjects: именно эта ф-ция используется вместе с FindFirstChangeNotification в примере из msdn.
Номер ответа: 22
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #22
Добавлено: 23.01.06 12:38
Люди, если кто-то сделал в соответствии с (16),(20), поделитесь этим кодом, плс.
Номер ответа: 23
Автор ответа:
Max
Вопросов: 12
Ответов: 17
Профиль | | #23
Добавлено: 23.01.06 12:41
базовый пример я взял отсюда:
http://www.mentalis.org/apilist/FindFirstChangeNotification.shtml
дальше буду уже сам додумывать и пробовать
спасибо всем за советы
Номер ответа: 24
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #24
Добавлено: 23.01.06 12:43
На VB такое лажево делать, разве что ActiveX.exe. На сях - другое дело, но не каждому отдельная длля понравится.
Номер ответа: 25
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #25
Добавлено: 23.01.06 14:45
Dll - этот точно такой же исполняемый код, как и ехе, только расширение файла другое.
Почему-то слово ехе никого не пугает, а от слова dll vb-шники в ужасе шарахаются, как от чумы, забывая при этом, что вся винда состоит, грубо говоря, из одних dll.
Номер ответа: 26
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #26
Добавлено: 23.01.06 15:01
Пугает не расширение файла, а само его наличие. Просто много людей не приемлет модульную архитектуру приложения и старается запихнуть весь код в один исполняемый файл. Почему-то...
Хотя сами три буквы dll могут пугать оттого что они vb-шникам недоступны Активиксы в счет не берем.
Номер ответа: 27
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #27
Добавлено: 23.01.06 15:38
Почему же dll недоступны???
Неужели кто-то запретил пользоваться vc или masm или delphi?
Номер ответа: 28
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #28
Добавлено: 23.01.06 15:53
Речь шла именно о VBшниках. Если знаешь что-то еще - разумеется, множество проблем снимается автоматически.
Только вот многие люди тут и с ВБ разобраться не могут
Номер ответа: 29
Автор ответа:
Max
Вопросов: 12
Ответов: 17
Профиль | | #29
Добавлено: 25.01.06 09:51
не так страшен Dll , как его малюют
а вообще с мультитредингом полегче будет и в новых проектах на .NET используем.
но пока еще есть проекты "старые", с которыми приходится мудохаться.
Номер ответа: 30
Автор ответа:
Alexandrus
ICQ: 496782368
Вопросов: 18
Ответов: 312
Web-сайт:
Профиль | | #30
Добавлено: 26.01.06 22:36
Мах:
Вот пример для VB6.
Увы, при моих экспериментах я добился работы только с каталогами,вернее изменения содержимого каталога,но ничто не мешает при успешном возврате уведомлении проверить нужный тебе файл другими средствами VB.
Особенность уведомлений в том,что прога виснет до истечения заданного времени ожидания события или виснет совсем если задано неограниченное время ожидания и событие так и не произошло.Можно попробовать прикрутить к отдельному потоку,но зная как VB6 c ними работает...
И тем не менее вот пример ожидания уведомления.
Константы контроля:
FILE_NOTIFY_CHANGE_FILE_NAME = &H1 Создание,удаление,переименование файла
FILE_NOTIFY_CHANGE_DIR_NAME = &H2 Создание,удаление,переименование каталога
FILE_NOTIFY_CHANGE_ATTRIBUTES = &H4 Изменение атрибутов файла
FILE_NOTIFY_CHANGE_LAST_WRITE = &H10 Изменение размера файла
FILE_NOTIFY_CHANGE_SECURITY = &H100 Изменение параметров защиты файлов(только NT)
INFINITE = &HFFFF Для неограниченного ожидания
Возвращаемые значения:
Private Const WAIT_FAILED = -1& Ожидание не сработало
Private Const WAIT_OBJECT_0 = 0 Есть изменение
Private Const WAIT_TIMEOUT = &H102& Истекло время ожидания
Dim hRev As Long
Dim lngStatus As Long
Dim hTime as long
Dim hSub as long '0-без подкаталогов 1- с подкаталогами
hTime=5000 'ожидать 5000 миллисекунд
hRev = FindFirstChangeNotification("c:\test\", hSub, FILE_NOTIFY_CHANGE_SIZE)
lngStatus = WaitForSingleObject(hRev, hTime)
Select lngStatus
case WAIT_FAILED
case WAIT_OBJECT_0
case WAIT_TIMEOUT
end select
С ув. Alex