windows - RegisterWaitForSingleObject 使用 RealBasic 监视目录

标签 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 Explorer 时,应用程序开始崩溃或锁定。我必须退出 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/zh-cn/library/ms685061.aspx) 上调用:

The callback routine is executed by a worker thread when the object's state becomes signaled or the time-out interval elapses.

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

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

关于windows - RegisterWaitForSingleObject 使用 RealBasic 监视目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5599169/

相关文章:

c++ - C 函数回调与 C++ 方法回调

delphi - 如何使用此 CustomSort 函数对 ListView 进行排序?

c# - 对于 Windows 应用程序,c# 比 delphi/realbasic 有什么优势

mysql - REALBasic 和 MySQL

permissions - RealBasic应用程序在Writeline上崩溃

linux - Windows IPC 模拟 Linux Unix 域和 Netlink 套接字

c++ - Windows C++ 十六进制查看器 GUI 组件

php - Windows bash NGINX 未完成成功的 PHP-FPM 操作

ruby - 中间人服务器在 Windows 0.0.0.0 :4567 上不工作

javascript - jQuery 传递回调函数但使用返回值