Асинхронное ожидание множества событий файловых операций (пример для класса от 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

Оцени полезность:

11   голосов , оценка 4.182 из 5
Похожие ответы