RegisterWaitForSingleObject使用RealBasic观看目录

时间:2011-04-08 18:17:24

标签: windows callback 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(即,当目录中发生更改时),事情变得......很奇怪。应用程序从Process Explorer和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中有一些限制导致回调内爆系统?

2 个答案:

答案 0 :(得分:2)

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

  

当对象的状态发出信号或超时间隔过去时,回调例程由工作线程执行。

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

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

答案 1 :(得分:0)

可能没有关系,但MyCallBackFn()声明在哪里?如果是实例方法,则应使用WeakAddressOf而不是AddressOf。