AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen FreePascal FreePascal TTimer will nicht wie er soll
Thema durchsuchen
Ansicht
Themen-Optionen

TTimer will nicht wie er soll

Ein Thema von Moombas · begonnen am 18. Sep 2019 · letzter Beitrag vom 20. Sep 2019
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#1

TTimer will nicht wie er soll

  Alt 18. Sep 2019, 10:37
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;
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.

Geändert von Moombas (18. Sep 2019 um 11:17 Uhr)
  Mit Zitat antworten Zitat
ghubi01

Registriert seit: 18. Nov 2017
133 Beiträge
 
Delphi 12 Athens
 
#2

AW: TTimer will nicht wie er soll

  Alt 18. Sep 2019, 16:49
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.

Geändert von ghubi01 (18. Sep 2019 um 17:43 Uhr) Grund: Nachtrag
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#3

AW: TTimer will nicht wie er soll

  Alt 19. Sep 2019, 08:19
Nein Interval steht auf 1000, also 1 Sekunde. Habe das auch sicherheitshalber per showmessage einmal anzeigen lassen, der bleibt bei 1000.
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.

Geändert von Moombas (19. Sep 2019 um 08:50 Uhr)
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#4

AW: TTimer will nicht wie er soll

  Alt 19. Sep 2019, 09:22
Wenn du uns mitgeteilt hättest, dass du den DirectoryWatcher verwendest, dann hätten wir gewusst, dass der Aufruf von TTools.OnNotify nicht im MainThread-Kontext erfolgt und dann hätten (wenigstens bei mir) alle Alarmglocken geläutet.

Und ja, wenn du den Timer synchronisiert im MainThread-Kontext einschaltest, dann wird auch der Timer-Event ausgelöst.
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#5

AW: TTimer will nicht wie er soll

  Alt 19. Sep 2019, 10:58
Ich musste zu https://forum.lazarus.freepascal.org...?topic=37415.0 wechseln wegen Lazarus.

Das mit der Synchronisierung ist für mich neu, wie müsste ich das für

Timer3.Enabled := True;

umsetzen?
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#6

AW: TTimer will nicht wie er soll

  Alt 19. Sep 2019, 11:15
So
Delphi-Quellcode:
procedure TTool.OnNotifySynchronized();
begin
  Timer3.Enabled := true;
end;

procedure TTools.OnNotify(const FilePath: WideString; const Action: TDirectoryEventType);
...
  TThread.Synchronize(nil,@OnNotifySynchronized);
...
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#7

AW: TTimer will nicht wie er soll

  Alt 19. Sep 2019, 13:57
Bekomme im Compiler dann folgende Fehlermeldung: Error: Variable identifier expected
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#8

AW: TTimer will nicht wie er soll

  Alt 19. Sep 2019, 14:24
Bekomme im Compiler dann folgende Fehlermeldung: Error: Variable identifier expected
Ich gehe halt davon aus, dass bei FreePascal die units auf {$mode objfpc} eingestellt sind. Ansonsten musst du mir das mitteilen oder eben selber adaptieren.
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#9

AW: TTimer will nicht wie er soll

  Alt 19. Sep 2019, 14:31
ich habe {$MODE Delphi} eingestellt.
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#10

AW: TTimer will nicht wie er soll

  Alt 19. Sep 2019, 14:39
ich habe {$MODE Delphi} eingestellt.
Und du hast noch nie in deinem Leben im Delphi-Mode unter Lazarus/FreePascal einen Methoden-Zeiger als Parameter übergeben, oder einer Variablen oder einem Event zugewiesen?

Denn mehr passiert da nicht.

Des Rätsels Lösung:

Lass das @ Zeichen im {$mode delphi} weg.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz