Hallo leute,
ich habe nen timer in nen Thread ausgelagert, um unabhängig von eventuell rechenintensiven prozeduren immer die aktuelle zeit in der anwendung angezeigt zu bekommen.
Folgendermaßen sieht die implementierung aus
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92:
| type TCBThreadTimer = class(TThread) private FTimer: TTimer; FSeconds, FMinutes, FHour: Integer; FTimerSecondsWereNulled: Boolean; FSynchronizeEvent: TNotifyEvent; procedure OnThreadTimer(ASender: TObject); procedure SynchronizeDisplayWithApp; public destructor destroy; override; constructor create(ASecond, AMinute, AHour: Integer);overload; procedure execute; override; procedure cbKillTimer; property Minute: Integer read FMinutes; property Hour: Integer read FHour; property SynchronizeEvent: TNotifyEvent read FSynchronizeEvent write FSynchronizeEvent; end;
implementation
uses SysUtils;
{ TCBThreadTimer }
//------------------------------------------------------------------------------ procedure TCBThreadTimer.cbKillTimer; begin while not terminated do Terminate; end;
//------------------------------------------------------------------------------ constructor TCBThreadTimer.create(ASecond, AMinute, AHour: Integer); begin FSeconds := ASecond; FMinutes := AMinute; FHour := AHour; FTimer := TTimer.Create(nil); FTimer.Interval := 60000 - (ASecond * 1000); FTimer.Enabled := false; FTimer.OnTimer := OnThreadTimer; FTimerSecondsWereNulled := false; FreeOnTerminate := true; inherited create(TRUE); end;
//------------------------------------------------------------------------------ destructor TCBThreadTimer.destroy; begin FTimer.OnTimer := nil; FreeAndNil(FTimer); inherited; end;
//------------------------------------------------------------------------------ procedure TCBThreadTimer.execute; begin resume; FTimer.Enabled := true; inherited; end;
//------------------------------------------------------------------------------ procedure TCBThreadTimer.OnThreadTimer(ASender: TObject); begin if not FTimerSecondsWereNulled then begin FTimer.Interval := 60000; FTimerSecondsWereNulled := true; end; inc(FMinutes); if FMinutes = 60 then begin FMinutes := 0; inc(FHour); end; if FHour = 24 then FHour := 0; if assigned(FSynchronizeEvent) then Synchronize(SynchronizeDisplayWithApp); end;
//------------------------------------------------------------------------------ procedure TCBThreadTimer.SynchronizeDisplayWithApp; begin FSynchronizeEvent(Self); end; |
ich erzeuge den thread so:
Quelltext
1: 2: 3:
| FThreadTimer := TCBThreadTimer.create(LSecond, LMinute, LHour); FThreadTimer.SynchronizeEvent := SetTimeToDisplay; FThreadTimer.execute; |
SetTimeToDisplay sieht so aus
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.SetTimeToDisplay(ASender: TObject); var LMinString, LHourString: String; begin if FThreadTimer.Minute < 10 then LMinString := '0'; LMinString := LMinString + IntToStr(FThreadTimer.Minute); if FThreadTimer.Hour < 10 then LHourString := '0'; LHourString := LHourString + IntToStr(FThreadTimer.Hour);
vSBar.Panels[2].Text := 'Serveruhrzeit: ' + LHourString + ':' + LMinString; end; |
Kann mir wer sagen, was daran falsch läuft?
Gruß
KEn