Асинхронное ожидание множества событий файловых операций (пример для класса от The Trick) - VB
Формулировка задачи:
Написал пример для использования vbWaitForMultipleObjects для мониторинга множества папок с помощью этого класса.
Видимо неправильно передаю указатель на массив хендлов событий,
ибо начинает сыпатся куча уведомлений с пустым именем файлов.
The Trick, можешь, пожалуйста, как освободишься, посмотреть?
И еще, как в Callback процедуре получить код возврата WaitForMultipleObjects,
чтобы узнать от которого из событий пришло уведомление?
Решение задачи: «Асинхронное ожидание множества событий файловых операций (пример для класса от The Trick)»
textual
Листинг программы
' // Ñîáûòèå âîçГ*ГЁГЄГ*ГҐГІ ïðè èçìåГ*ГҐГ*ГЁГїГµ Гў äèðåêòîðèè Г*Г* êîòîðûå ìû ïîäïèñГ*Г*Г» Private Sub mon_OnWait(ByVal Handle As Long, ByVal Result As Long) Dim notify As FILE_NOTIFY_INFORMATION Dim OBJ_idx As Long Dim idx As Long Dim name As String OBJ_idx = Result ' !!! <--- ÄîëæåГ* áûòü ГЁГ*äåêñ îòñëåæèâГ*åìîãî ñîáûòèÿ If OBJ_idx >= 0 Then ' Ïðîõîä ГЇГ® áóôåðó óâåäîìëåГ*ГЁГ© Do ' Êîïèðóåì ГўГ® âðåìåГ*Г*ГіГѕ ñòðóêòóðó óâåäîìëåГ*ГЁГҐ ' Çäåñü ГЇГ°Г*âèëüГ*ГҐГҐ ñäåëГ*ГІГј ÷åðåç ГіГЄГ*Г§Г*òåëè, Г*Г® äëÿ ïðèìåðГ* Гї îñòГ*ГўГЁГ« ГІГ*ГЄ (áîëåå ГЇГ®Г*ГїГІГ*Г®) memcpy notify, Events(OBJ_idx).bufEvent(idx), Len(notify) ' ÓçГ*Г*ГҐГ¬ èìÿ ГґГ*éëГ* name = Chr$(34) & Left$(notify.wcFileName, notify.dwFileNameLength \ 2) & Chr$(34) ' Ïðîâåðÿåì ГІГЁГЇ óâåäîìëåГ*ГЁГї Select Case notify.dwAction Case FILE_ACTION_ADDED: name = "ADDED: " & name ' Г”Г*éë äîáГ*âëåГ* Case FILE_ACTION_REMOVED: name = "REMOVED: " & name ' Г”Г*éë ГіГ¤Г*ëåГ* Case FILE_ACTION_RENAMED_OLD_NAME: name = "RENAMED (old name): " & name ' Г”Г*éë ïåðåèìåГ*îâГ*Г* - ГЅГІГ® Г±ГІГ*ðîå èìÿ Case FILE_ACTION_RENAMED_NEW_NAME: name = "RENAMED (new name): " & name ' Г”Г*éë ïåðåèìåГ*îâГ*Г* - ГЅГІГ® Г*îâîå èìÿ End Select ' ÄîáГ*ГўГЁГІГј Гў ñïèñîê Debug.Print name ' Ïåðåõîä ГЄ ñëåäóþùåìó óâåäîìëåГ*ГЁГѕ idx = idx + notify.dwNextEntryOffset ' ÏîêГ* ГҐГ±ГІГј óâåäîìëåГ*ГЁГї Гў áóôåðå ïîâòîðÿåì Loop While notify.dwNextEntryOffset ' ÑáðГ*ñûâГ*ГҐГ¬ ñîáûòèå ResetEvent hEvent(OBJ_idx) ' Г‡Г*ïîëГ*ГїГҐГ¬ ñòðóêòóðó OVERLAPPED ovr(OBJ_idx).hEvent = hEvent(OBJ_idx) ' Г‡Г*ГЇГіГ±ГЄГ*ГҐГ¬ ìîГ*èòîðèГ*ГЈ Call ReadDirectoryChanges(hDirectory(OBJ_idx), Events(OBJ_idx).bufEvent(0), UBound(Events(OBJ_idx).bufEvent) + 1, False, FILE_NOTIFY_CHANGE_FILE_NAME, 0&, ovr(OBJ_idx), 0&) End If ' Г‘Г*ГЁГ¬Г*ГҐГ¬ Г±ГІГ*ðîå óâåäîìëåГ*ГЁГҐ mon.Abort ' Г‡Г*ГЇГіГ±ГЄГ*ГҐГ¬ Г*îâîå ' !!! - handle ??? mon.vbWaitForMultipleObjects UBound(hEvent) + 1, VarPtr(hEvent(0)), 0&, INFINITE End Sub
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д