windows - RegisterWaitForSingleObject at se et bibliotek ved hjælp af RealBasic

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at se et bibliotek for ændringer ved hjælp af FindFirstChangeNotification-funktionen. Dette virker, hvis jeg tager håndtaget tilbage af FindFirstChangeNotification og sætter det i WaitForSingleObject. Problemet er, at WaitForSingleObject blokerer hele applikationen, indtil den vender tilbage. [7]


Så jeg kiggede rundt, og det ser ud til, at RegisterWaitForSingleObject var vejen at gå: [8]


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


Dette vises for at fungere, da applikationen fortsætter med at udføres normalt. Men så snart MyCallbackFn bliver kaldt (det vil sige, når der sker en ændring i biblioteket), bliver tingene ... underlige. Applikationer begynder at krasje eller låse op, begyndende med Process Explorer og Windows Explorer. Jeg er nødt til at logge ud af Windows for at genoprette tingene.


I øjeblikket er alt det, MyCallbackFn gør, det her:


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


Skaler jeg det forkerte træ ved at bruge RegisterWaitForSingleObject, har jeg brugt det fejlagtigt, eller er der nogen begrænsning i RealBasic, der forårsager tilbagekaldelser til at implodere systemet?

Bedste reference


Den tilbagekaldelsesfunktion, du registrerer i RegisterWaitForSingleObject(), kaldes på en anden tråd (http://msdn.microsoft.com/en-us/library/ms685061.aspx):



  Tilbagekaldelsesrutinen udføres af en arbejdstråd, når objektets tilstand bliver signaleret eller tidsintervallet forløber.



Jeg ved ikke noget om RealBasic's threading-support, men i det mindste skal GUI-operationer på Windows typisk finde sted på en bestemt tråd, ikke bare en gammel arbejdstråd. Så kaldet til MsgBox() på den pågældende tråd er sandsynligvis et problem.


En simpel ting, du kan prøve, er at ringe PostMessage() (eller hvad RealBasic-ækvivalenten er) for at sende en brugerdefineret besked til din vinduekommandokø, som din ansøgning kan reagere på (f.eks. Ved at ringe MsgBox()).

Andre referencer 1


Måske ikke relateret, men hvor er MyCallBackFn () erklæret? Hvis det er en instansmetode, skal du bruge WeakAddressOf i stedet for AddressOf.