![]() |
TTimer will nicht wie er soll
Ich bin ja noch dabei mein Programm in Lazarus umzusetzen von Delphi.
Dabei habe ich aktuell folgenbdes Phänomen: Es wird ein Watcher gestartet, welcher einen Ordner überwacht und dann OnNotify auslöst. -> funktioniert Dieser prüft ob es eine logfile ist und führt Aktionen aus. Die letzte der Aktionen ist es einen TTimer zu starten (Timer3), er erhält auch wirklich den Status True (Timer.enabled ist nach dem setzen beim auslesen -1) aber der Timer läuft nicht los. Jemand eine Idee?
Delphi-Quellcode:
procedure TTools.OnNotify(const FilePath: WideString; const Action: TDirectoryEventType);
var start, i : integer; FileName : WideString; begin FileName := ''; start := 1; for i := length(FilePath) downto 1 do begin if FilePath[i] = '\' then begin start := i + 1; break; end; end; for i := start to length(FilePath) do begin FileName := FileName + FilePath[i]; end; if (Split(String(FileName), '2', 0) = 'Log') or (Split(String(FileName), '2', 0) = 'log') then begin case Action of detAdded: begin Instant.Enabled := True; Run.Enabled := False; LogL.Caption := String(Filename + ' gefunden.'); LogL.Left := 72; LogA.Caption := 'Logdatei prüfen...'; LogA.Show; sFileAction := 'Edited'; LogDatei := Filename; LogName := FilePath; LogA.Caption := DateTimeToStr(ReportFileTimes(LogName)); LogA.Left := 72; FileChange := ReportFileTimes(LogName); olddate := FileChange; //showmessage(BoolToStr(Timer3.Enabled)); //Nur temporär zum Prüfen welchen Wert der Timer vorher hat -> False (0) Timer3.Enabled := True; //showmessage(BoolToStr(Timer3.Enabled)); //Nur temporär zum Prüfen ob True gesetzt wird -> ja (-1) end; detRemoved: ; detModified: ; end; end; end; //Timer für Dateidatumsänderung procedure TTools.Timer3Timer(Sender: TObject); function GetProcessHandleFromID(ID: DWORD): THandle; begin result := OpenProcess(SYNCHRONIZE, False, ID); CloseHandle(result); end; begin //showmessage('Timer3'); //Testweise eingefügt, erscheint nicht. if fileexists(String(LogName)) then begin newdate := ReportFileTimes(WideString(LogName)); if newdate <> olddate then begin olddate := newdate; Timer3.Enabled := True; end else begin if AppPID <> 0 then begin if GetProcessHandleFromID(AppPID) = 0 then begin Timer3.Enabled := False; Progress.Visible := False; if FertigC.Checked then begin FertigClick(Sender); end else begin Fertig.Enabled := True; end; Run.Enabled := False; Programs.Enabled := True; Data.Enabled := True; TxTLogs.Enabled := True; Escape.Enabled := False; LogA.Caption := 'Programm fertig.'; Timer3.Enabled := False; AppPID := 0; end; end else begin showmessage('Es wurde kein Programm gefunden!'); Timer3.Enabled := False; Progress.Visible := False; if FertigC.Checked then begin FertigClick(Sender); end else begin Fertig.Enabled := True; end; Run.Enabled := False; Programs.Enabled := True; Data.Enabled := True; TxTLogs.Enabled := True; Escape.Enabled := False; LogA.Caption := 'Programm nicht gefunden!'; Timer3.Enabled := False; end; end; end; end; |
AW: TTimer will nicht wie er soll
Hallo,
welchen Wert hast Du bei Interval stehen? Ist der vielleicht viel zu groß? Oder Interval hat den Wert 0. Dann wird das Timerereignis nicht ausgelößt. |
AW: TTimer will nicht wie er soll
Nein Interval steht auf 1000, also 1 Sekunde. Habe das auch sicherheitshalber per showmessage einmal anzeigen lassen, der bleibt bei 1000.
|
AW: TTimer will nicht wie er soll
Wenn du uns mitgeteilt hättest, dass du den
![]()
Delphi-Quellcode:
nicht im MainThread-Kontext erfolgt und dann hätten (wenigstens bei mir) alle Alarmglocken geläutet.
TTools.OnNotify
Und ja, wenn du den Timer synchronisiert im MainThread-Kontext einschaltest, dann wird auch der Timer-Event ausgelöst. |
AW: TTimer will nicht wie er soll
Ich musste zu
![]() Das mit der Synchronisierung ist für mich neu, wie müsste ich das für Timer3.Enabled := True; umsetzen? |
AW: TTimer will nicht wie er soll
So
Delphi-Quellcode:
procedure TTool.OnNotifySynchronized();
begin Timer3.Enabled := true; end; procedure TTools.OnNotify(const FilePath: WideString; const Action: TDirectoryEventType); ... TThread.Synchronize(nil,@OnNotifySynchronized); ... |
AW: TTimer will nicht wie er soll
Bekomme im Compiler dann folgende Fehlermeldung: Error: Variable identifier expected
|
AW: TTimer will nicht wie er soll
Zitat:
Delphi-Quellcode:
eingestellt sind. Ansonsten musst du mir das mitteilen oder eben selber adaptieren.
{$mode objfpc}
|
AW: TTimer will nicht wie er soll
ich habe {$MODE Delphi} eingestellt.
|
AW: TTimer will nicht wie er soll
Zitat:
Denn mehr passiert da nicht. Des Rätsels Lösung: Lass das
Delphi-Quellcode:
Zeichen im
@
Delphi-Quellcode:
weg.
{$mode delphi}
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz