From: <ob...@us...> - 2009-08-10 17:21:19
|
Revision: 12445 http://jvcl.svn.sourceforge.net/jvcl/?rev=12445&view=rev Author: obones Date: 2009-08-10 17:21:13 +0000 (Mon, 10 Aug 2009) Log Message: ----------- Removed UTF-8 BOM Modified Paths: -------------- trunk/jvcl/run/JvScheduledEvents.pas Modified: trunk/jvcl/run/JvScheduledEvents.pas =================================================================== --- trunk/jvcl/run/JvScheduledEvents.pas 2009-08-10 11:48:00 UTC (rev 12444) +++ trunk/jvcl/run/JvScheduledEvents.pas 2009-08-10 17:21:13 UTC (rev 12445) @@ -1,4 +1,4 @@ -{----------------------------------------------------------------------------- +{----------------------------------------------------------------------------- Project JEDI Visible Component Library (J-VCL) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2010-03-16 22:35:36
|
Revision: 12727 http://jvcl.svn.sourceforge.net/jvcl/?rev=12727&view=rev Author: ahuser Date: 2010-03-16 22:35:29 +0000 (Tue, 16 Mar 2010) Log Message: ----------- Mantis #5143: JvScheduledEvents -> "cannot assign a TJvEventCollectionItem to a TJvEventCollectionItem" Modified Paths: -------------- trunk/jvcl/run/JvScheduledEvents.pas Modified: trunk/jvcl/run/JvScheduledEvents.pas =================================================================== --- trunk/jvcl/run/JvScheduledEvents.pas 2010-03-16 22:20:45 UTC (rev 12726) +++ trunk/jvcl/run/JvScheduledEvents.pas 2010-03-16 22:35:29 UTC (rev 12727) @@ -129,6 +129,10 @@ property AppStorage: TJvCustomAppStorage read FAppStorage write SetAppStorage; property AppStoragePath: string read FAppStoragePath write FAppStoragePath; public + {$IFDEF COMPILER14_UP} + class destructor Destroy; + {$ENDIF COMPILER14_UP} + constructor Create(AOwner: TComponent); override; destructor Destroy; override; property Handle: THandle read FWnd; @@ -230,6 +234,7 @@ public constructor Create(Collection: TCollection); override; destructor Destroy; override; + procedure Assign(Source: TPersistent); override; procedure LoadState(const TriggerStamp: TTimeStamp; const TriggerCount, DayCount: Integer; const SnoozeStamp: TTimeStamp; const ALastSnoozeInterval: TSystemTime; const AEventInfo: TScheduledEventStateInfo); virtual; @@ -476,6 +481,13 @@ //=== { TJvCustomScheduledEvents } =========================================== +{$IFDEF COMPILER14_UP} +class destructor TJvCustomScheduledEvents.Destroy; +begin + FinalizeScheduleThread; +end; +{$ENDIF COMPILER14_UP} + constructor TJvCustomScheduledEvents.Create(AOwner: TComponent); begin inherited Create(AOwner); @@ -780,7 +792,6 @@ FEvents.Assign(Value); end; - procedure TJvCustomScheduledEvents.WndProc(var Msg: TMessage); var List: TList; @@ -817,7 +828,6 @@ end; end; - procedure TJvCustomScheduledEvents.CMExecEvent(var Msg: TMessage); begin with Msg do @@ -915,6 +925,19 @@ end; end; +procedure TJvEventCollectionItem.Assign(Source: TPersistent); +begin + if Source is TJvEventCollectionItem then + begin + Name := TJvEventCollectionItem(Source).Name; + CountMissedEvents := TJvEventCollectionItem(Source).CountMissedEvents; + Schedule := TJvEventCollectionItem(Source).Schedule; + OnExecute := TJvEventCollectionItem(Source).OnExecute; + end + else + inherited Assign(Source); +end; + procedure TJvEventCollectionItem.Triggered; begin FState := sesTriggered; @@ -1581,7 +1604,9 @@ {$ENDIF UNITVERSIONING} finalization + {$IFNDEF COMPILER14_UP} FinalizeScheduleThread; + {$ENDIF ~COMPILER14_UP} {$IFDEF UNITVERSIONING} UnregisterUnitVersion(HInstance); {$ENDIF UNITVERSIONING} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2010-05-16 12:57:36
|
Revision: 12772 http://jvcl.svn.sourceforge.net/jvcl/?rev=12772&view=rev Author: ahuser Date: 2010-05-16 12:57:30 +0000 (Sun, 16 May 2010) Log Message: ----------- Mantis #5027: JvScheduledEvents - race condition when handling WM_TIMECHANGE Modified Paths: -------------- trunk/jvcl/run/JvScheduledEvents.pas Modified: trunk/jvcl/run/JvScheduledEvents.pas =================================================================== --- trunk/jvcl/run/JvScheduledEvents.pas 2010-05-16 12:57:02 UTC (rev 12771) +++ trunk/jvcl/run/JvScheduledEvents.pas 2010-05-16 12:57:30 UTC (rev 12772) @@ -807,18 +807,21 @@ // "to be restarted", stop and then restart them. List := TList.Create; try - for I := 0 to FEvents.Count - 1 do - begin - if FEvents[I].State in [sesTriggered, sesExecuting, sesPaused] then + ScheduleThread.Lock; + try + for I := 0 to FEvents.Count - 1 do begin - List.Add(FEvents[I]); - FEvents[I].Stop; + if FEvents[I].State in [sesTriggered, sesExecuting, sesPaused] then + begin + List.Add(FEvents[I]); + FEvents[I].Stop; + end; end; + for I := 0 to List.Count - 1 do + TJvEventCollectionItem(List[I]).Start; + finally + ScheduleThread.Unlock; end; - for I := 0 to List.Count - 1 do - begin - TJvEventCollectionItem(List[I]).Start; - end; finally List.Free; end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ob...@us...> - 2010-10-11 07:56:31
|
Revision: 12861 http://jvcl.svn.sourceforge.net/jvcl/?rev=12861&view=rev Author: obones Date: 2010-10-11 07:56:25 +0000 (Mon, 11 Oct 2010) Log Message: ----------- Mantis 5296: Must check that FScheduleFire is not null because CompareTimeStamps reports > 0 when comparing to a null stamp Modified Paths: -------------- trunk/jvcl/run/JvScheduledEvents.pas Modified: trunk/jvcl/run/JvScheduledEvents.pas =================================================================== --- trunk/jvcl/run/JvScheduledEvents.pas 2010-10-11 07:29:54 UTC (rev 12860) +++ trunk/jvcl/run/JvScheduledEvents.pas 2010-10-11 07:56:25 UTC (rev 12861) @@ -1034,7 +1034,8 @@ function TJvEventCollectionItem.GetNextFire: TTimeStamp; begin - if IsNullTimeStamp(FSnoozeFire) or (CompareTimeStamps(FSnoozeFire, FScheduleFire) > 0) then + if IsNullTimeStamp(FSnoozeFire) or + (not IsNullTimeStamp(FScheduleFire) and (CompareTimeStamps(FSnoozeFire, FScheduleFire) > 0)) then Result := FScheduleFire else Result := FSnoozeFire; @@ -1047,8 +1048,8 @@ if State <> sesTriggered then Exit; // Ignore this message, something is wrong. FActualTriggerTime := DateTimeToTimeStamp(Now); - IsSnoozeFire := CompareTimeStamps(FActualTriggerTime, FSnoozeFire) >= 0; - if IsSnoozeFire and (CompareTimeStamps(FActualTriggerTime, FScheduleFire) >= 0) then + IsSnoozeFire := not IsNullTimeStamp(FSnoozeFire) and (CompareTimeStamps(FActualTriggerTime, FSnoozeFire) >= 0); + if IsSnoozeFire and not IsNullTimeStamp(FScheduleFire) and (CompareTimeStamps(FActualTriggerTime, FScheduleFire) >= 0) then begin { We can't have both, the schedule will win (other possibility: generate two succesive events from this method, one as a snooze, the other as a schedule) } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ah...@us...> - 2012-06-15 08:24:17
|
Revision: 13356 http://jvcl.svn.sourceforge.net/jvcl/?rev=13356&view=rev Author: ahuser Date: 2012-06-15 08:24:05 +0000 (Fri, 15 Jun 2012) Log Message: ----------- Mantis 5026: JvScheduledEvents - race condition. Events are now put into a list and that is updated when an event is removed from the collection. Modified Paths: -------------- trunk/jvcl/run/JvScheduledEvents.pas Modified: trunk/jvcl/run/JvScheduledEvents.pas =================================================================== --- trunk/jvcl/run/JvScheduledEvents.pas 2012-06-14 10:30:01 UTC (rev 13355) +++ trunk/jvcl/run/JvScheduledEvents.pas 2012-06-15 08:24:05 UTC (rev 13356) @@ -103,6 +103,8 @@ FAppStoragePath: string; FAutoSave: Boolean; FEvents: TJvEventCollection; + FPostedEvents: TList; + FEventsPosted: Boolean; FOnStartEvent: TNotifyEvent; FOnEndEvent: TNotifyEvent; FWnd: THandle; @@ -112,6 +114,8 @@ procedure DoStartEvent(const Event: TJvEventCollectionItem); procedure SetAppStorage(Value: TJvCustomAppStorage); function GetEvents: TJvEventCollection; + procedure PostEvent(Event: TJvEventCollectionItem); + procedure RemovePostedEvent(Event: TJvEventCollectionItem); procedure InitEvents; procedure Loaded; override; procedure LoadSingleEvent(Sender: TJvCustomAppStorage; @@ -161,6 +165,7 @@ protected function GetItem(Index: Integer): TJvEventCollectionItem; procedure SetItem(Index: Integer; Value: TJvEventCollectionItem); + procedure Notify(Item: TCollectionItem; Action: TCollectionNotification); override; public constructor Create(AOwner: TPersistent); function Add: TJvEventCollectionItem; @@ -324,6 +329,7 @@ I: Integer; SysTime: TSystemTime; NowStamp: TTimeStamp; + SchedEvents: TJvCustomScheduledEvents; begin NameThread(ThreadName); try @@ -339,9 +345,10 @@ begin GetLocalTime(SysTime); NowStamp := DateTimeToTimeStamp(Now); - with SysTime do - NowStamp.Time := wHour * 3600000 + wMinute * 60000 + wSecond * 1000 + wMilliseconds; - TskColl := TJvCustomScheduledEvents(FEventComponents[FEventIdx]).Events; + NowStamp.Time := SysTime.wHour * 3600000 + SysTime.wMinute * 60000 + + SysTime.wSecond * 1000 + SysTime.wMilliseconds; + SchedEvents := TJvCustomScheduledEvents(FEventComponents[FEventIdx]); + TskColl := SchedEvents.Events; I := 0; while (I < TskColl.Count) and not Terminated do begin @@ -349,8 +356,7 @@ (CompareTimeStamps(NowStamp, TskColl[I].NextFire) >= 0) then begin TskColl[I].Triggered; - PostMessage(TJvCustomScheduledEvents(FEventComponents[FEventIdx]).Handle, - CM_EXECEVENT, LPARAM(TskColl[I]), 0); + SchedEvents.PostEvent(TskColl[I]); end; Inc(I); end; @@ -495,6 +501,7 @@ constructor TJvCustomScheduledEvents.Create(AOwner: TComponent); begin inherited Create(AOwner); + FPostedEvents := TList.Create; FEvents := TJvEventCollection.Create(Self); FWnd := AllocateHWndEx(WndProc); @@ -518,6 +525,7 @@ DeallocateHWndEx(FWnd); end; FEvents.Free; + FPostedEvents.Free; inherited Destroy; end; @@ -835,22 +843,82 @@ end; end; +procedure TJvCustomScheduledEvents.PostEvent(Event: TJvEventCollectionItem); +begin + ScheduleThread.Lock; + try + FPostedEvents.Add(Event); + if not FEventsPosted then + begin + // Post one message for all posted events + FEventsPosted := True; + PostMessage(Handle, CM_EXECEVENT, 0, 0); + end; + finally + ScheduleThread.Unlock; + end; +end; + +procedure TJvCustomScheduledEvents.RemovePostedEvent(Event: TJvEventCollectionItem); +begin + if not (csDestroying in ComponentState) and (GScheduleThread <> nil) then + begin + ScheduleThread.Lock; + try + Event.FState := sesEnded; + while FPostedEvents.Remove(Event) <> -1 do + ; + finally + ScheduleThread.Unlock; + end; + end; +end; + procedure TJvCustomScheduledEvents.CMExecEvent(var Msg: TMessage); +var + Event: TJvEventCollectionItem; begin - with Msg do + try + ScheduleThread.Lock; try - DoStartEvent(TJvEventCollectionItem(WParam)); - TJvEventCollectionItem(WParam).Execute; - DoEndEvent(TJvEventCollectionItem(WParam)); - Result := 1; - except - if Assigned(ApplicationHandleException) then - ApplicationHandleException(Self); - end + while FPostedEvents.Count > 0 do + begin + Event := FPostedEvents[0]; + FPostedEvents.Delete(0); + + ScheduleThread.Unlock; // the user code must not be protected by the critical section + try + try + DoStartEvent(Event); + Event.Execute; + DoEndEvent(Event); + except + // proceed with the next event as if it were 2 messages + if Assigned(ApplicationHandleException) then + ApplicationHandleException(Self); + end; + finally + ScheduleThread.Lock; + end; + end; + finally + FEventsPosted := False; + ScheduleThread.Unlock; + end; + except + if Assigned(ApplicationHandleException) then // don't let exceptions escape + ApplicationHandleException(Self); + end; + Msg.Result := 1; end; //=== { TJvEventCollection } ================================================= +constructor TJvEventCollection.Create(AOwner: TPersistent); +begin + inherited Create(AOwner, TJvEventCollectionItem); +end; + function TJvEventCollection.GetItem(Index: Integer): TJvEventCollectionItem; begin Result := TJvEventCollectionItem(inherited Items[Index]); @@ -861,11 +929,6 @@ inherited Items[Index] := Value; end; -constructor TJvEventCollection.Create(AOwner: TPersistent); -begin - inherited Create(AOwner, TJvEventCollectionItem); -end; - function TJvEventCollection.Add: TJvEventCollectionItem; begin Result := TJvEventCollectionItem(inherited Add); @@ -876,6 +939,13 @@ Result := TJvEventCollectionItem(inherited Insert(Index)); end; +procedure TJvEventCollection.Notify(Item: TCollectionItem; Action: TCollectionNotification); +begin + inherited Notify(Item, Action); + if Action in [cnExtracting, cnDeleting] then + (Owner as TJvCustomScheduledEvents).RemovePostedEvent(Item as TJvEventCollectionItem); +end; + //=== { TJvEventCollectionItem } ============================================= constructor TJvEventCollectionItem.Create(Collection: TCollection); @@ -926,6 +996,7 @@ begin ScheduleThread.Lock; try + Stop; inherited Destroy; finally ScheduleThread.Unlock; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |