--- ibx/trunk/fbintf/client/3.0/FB30Events.pas 2016/12/06 10:33:46 46 +++ ibx/trunk/fbintf/client/3.0/FB30Events.pas 2017/01/09 15:31:51 47 @@ -84,7 +84,7 @@ type {IEvents} procedure WaitForEvent; - procedure AsyncWaitForEvent(EventHandler: TEventHandler); + procedure AsyncWaitForEvent(EventHandler: TEventHandler); override; end; implementation @@ -125,7 +125,7 @@ begin {$ENDIF} inherited Create; {$IFDEF WINDOWS} - FEventHandler := CreateEvent(PSa,false,true,nil); + FEventHandler := CreateEvent(PSa,false,false,nil); {$ELSE} CreateGuid(GUID); FEventWaiting := TEventObject.Create(PSa,false,false,GUIDToString(GUID)); @@ -166,14 +166,15 @@ begin try if FOwner.FResultBuffer <> nil then Move(events[0], FOwner.FResultBuffer[0], Length); - {$IFDEF WINDOWS} - SetEvent(FEventHandler); - {$ELSE} - FEventWaiting.SetEvent; - {$ENDIF} finally FOwner.FCriticalSection.Leave end; +// writeln('Set Event'); + {$IFDEF WINDOWS} + SetEvent(FEventHandler); + {$ELSE} + FEventWaiting.SetEvent; + {$ENDIF} end; procedure TEventhandlerInterface.WaitForEvent; @@ -183,6 +184,7 @@ begin {$ELSE} FEventWaiting.WaitFor(INFINITE); {$ENDIF} +// writeln('Event Wait Ends'); end; procedure TEventhandlerInterface.CancelWait; @@ -258,7 +260,6 @@ begin if FInWaitState then IBError(ibxeInEventWait,[nil]); - CreateEventBlock; FEventHandler := EventHandler; ReleaseIntf; with Firebird30ClientAPI do @@ -286,8 +287,6 @@ constructor TFB30Events.Create(DBAttachm begin inherited Create(DBAttachment,DBAttachment,Events); FAttachmentIntf := DBAttachment.AttachmentIntf; - FAsyncEventCallback := TEventhandlerInterface.Create(self,'Async'); - FEventHandlerThread := TEventHandlerThread.Create(self,FAsyncEventCallback); FSyncEventCallback := TEventhandlerInterface.Create(self,'Sync'); end; @@ -304,6 +303,12 @@ end; procedure TFB30Events.AsyncWaitForEvent(EventHandler: TEventHandler); begin + {Seems like we have to create a new callback object each time to avoid empty events} + if assigned(FEventHandlerThread) then + TEventHandlerThread(FEventHandlerThread).Terminate; + if assigned(FAsyncEventCallback) then TEventhandlerInterface(FAsyncEventCallback).release; + FAsyncEventCallback := TEventhandlerInterface.Create(self,'Async'); + FEventHandlerThread := TEventHandlerThread.Create(self,FAsyncEventCallback); InternalAsyncWaitForEvent(EventHandler,FAsyncEventCallback); end;