RegisterWaitForSingleObject使用RealBasic观察一个目录



我试图使用FindFirstChangeNotification函数来观察目录的更改。如果我接受FindFirstChangeNotification返回的句柄并将其填充到WaitForSingleObject中,则可以工作。问题是WaitForSingleObject阻塞了整个应用程序,直到它返回。

所以,我环顾四周,似乎RegisterWaitForSingleObject是要走的路:

Sub monitorDir(dir As FolderItem)
  Declare Function FindFirstChangeNotificationW Lib "Kernel32" (dirPath As WString, watchChildren As Boolean, eventTypeFilter As Integer) As Integer
  Declare Function RegisterWaitForSingleObject Lib "Kernel32" (ByRef waiterHWND As Integer, HWND As Integer, cllbck As Ptr, _
  context As Integer, wait As Integer, flags As Integer) As Integer
  Dim allFilters As Integer = &h00000001 Or &h00000002 Or &h00000004 Or &h00000008 Or &h00000010_
      Or &h00000100
  Dim monitorHandle As Integer = FindFirstChangeNotificationW(dir.AbsolutePath, True, allFilters)
  If monitorHandle <> 0 Then
  Call RegisterWaitForSingleObject(myCallbackHWND, monitorHandle, AddressOf MyCallbackFn, 0, &hFFFFFFFF, 0)
End Sub

当应用程序继续正常执行时,显示可以工作。然而,一旦MyCallbackFn被调用(也就是说,当目录中发生变化时),事情就会变得……奇怪。从进程资源管理器和Windows资源管理器开始,应用程序开始崩溃或锁定。我必须退出Windows才能恢复一切。

目前,MyCallbackFn所做的就是:

Sub MyCallbackFn()
  Declare Function UnregisterWaitEx Lib "Kernel32" (waitHWND As Integer, eventHandle As Integer) As Integer
  Call UnregisterWaitEx(myCallbackHWND, 0)
  MsgBox("Change Detected")
End Sub

我吠错树通过使用RegisterWaitForSingleObject,我用错了吗,或者有一些限制在RealBasic导致回调崩溃的系统?

您在RegisterWaitForSingleObject()中注册的回调函数在另一个线程上调用(http://msdn.microsoft.com/en-us/library/ms685061.aspx):

当对象的状态变为有信号状态或超时时间结束时,工作线程执行回调例程。

我对RealBasic的线程支持一无所知,但至少Windows上的GUI操作通常需要发生在特定的线程上,而不仅仅是任何旧的工作线程。因此,在该工作线程上调用MsgBox()可能是一个问题。

一个简单的事情,你可以尝试调用PostMessage()(或任何RealBasic等效是)发布一个自定义消息到您的窗口消息队列,您的应用程序可以响应(例如通过调用MsgBox())。

也许不相关,但MyCallBackFn()在哪里声明?如果它是一个实例方法,你应该使用WeakAddressOf而不是AddressOf。

相关内容

  • 没有找到相关文章

最新更新