Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Timer klappt nicht in Dienst (https://www.delphipraxis.net/29165-timer-klappt-nicht-dienst.html)

dingdoi 4. Sep 2004 21:31


Timer klappt nicht in Dienst
 
N'Abend,

ich starte aus einem Thread heraus einen Timer. Der funktioniert auch, wenn ich diesen Thread aus einer normalen Anwendung heraus aufrufe. Sobald ich das ganze aber mit einem Dienst versuche, passiert nix mehr.

Irgendwelche Ideen?

Danke schonmal.

stefan2005 4. Sep 2004 21:35

Re: Timer klappt nicht in Dienst
 
Hi,
sry aber ich versteh nicht ganz, wie du das mit "dem Dienst" meinst ? :gruebel:

djmasi 4. Sep 2004 21:37

Re: Timer klappt nicht in Dienst
 
Ich denke mal er will es als Systemdienst laufen lassen.

@dingdoi: schau Dir mal die Tutorials von Luckie an

Duffy 4. Sep 2004 21:39

Re: Timer klappt nicht in Dienst
 
Hallo dingdoi,
ich will hoffen Du aktivierst den Timer erst, wenn der Dienst gestartet ist. Sonst rennt er los und die Initialisierungen sind noch garnicht abgeschlossen.

bye
Claus

dingdoi 4. Sep 2004 21:48

Re: Timer klappt nicht in Dienst
 
Der Dienst an sich läuft ohne Probleme. Der macht, was er soll.

Der Dienst startet einen Thread, aus dem wiederum der Timer gestartet wird. Das sollte soweit seine Richtigkeit haben. Alle anderen Funktionen werden richtig gestartet und ausgeführt. Nur eben der Timer nicht.

Luckie 5. Sep 2004 03:08

Re: Timer klappt nicht in Dienst
 
Ein Timer braucht eine MessageLoop und die hat ein Dienst in der Regel nicht. Willst du etwas periodisch machen, dann nimm eine Thread den du mit Sellep() entsprechen lange die Rechenzeit enziehst oder wenn es erst ab Windows 2000 laufen muss dann nimm MSDN-Library durchsuchenCreateTimerQueuTimer. Eine Headerübersetzung dazu findest du auf meiner Homepage.

dingdoi 5. Sep 2004 14:39

Re: Timer klappt nicht in Dienst
 
@Luckie: Klasse, mit CREATETIMERQUEUETIMER funktioniert es. Danke! :-D

Susanne 18. Jan 2005 13:24

Re: Timer klappt nicht in Dienst
 
Zeig mal wie du das mit CREATETIMERQUEUETIMER gemacht hast, das würde mich brennend interessieren

dingdoi 19. Jan 2005 19:54

Re: Timer klappt nicht in Dienst
 
Ich hoffe, dieses kleine Beispiel hilft dir weiter. :idea:

Code:
...

  TYPE
    TXyzThread = class(TThread)
    private
      hTimerQTimer: THandle; // <<<<<

    public
      constructor Create;
      destructor Destroy;
  end;

  procedure DoSomething(Context: Pointer; TimeOut: Boolean); stdcall; // <<<<<

implementation

  constructor TXyzThread.Create;
  begin

    CreateTimerQueueTimer(hTimerQTimer, 0, @DoSomething, nil, 60000, 60000, 0); // <<<<<

  end;

  destructor TXyzThread.Destroy;
  begin

    DeleteTimerQueueTimer(hTimerQTimer, 0, 0); // <<<<<

  end;

...

Susanne 20. Jan 2005 08:57

Re: Timer klappt nicht in Dienst
 
Ja vielen Dank für das Beispiel, aber ich hätte noch ein paar Fragen zu den drei Funktionen

Bei Create und Delete, welche PArameter werden da übergeben, das erste ist jeweils das Handle, aber der Rest? Das Handle steht für das Programm, für das der Timer ist?

Delphi-Quellcode:
CreateTimerQueueTimer(hTimerQTimer, 0, @DoSomething, nil, 60000, 60000, 0);
DeleteTimerQueueTimer(hTimerQTimer, 0, 0);
Was soll die Funktion bewirken?
Delphi-Quellcode:
procedure DoSomething(Context: Pointer; TimeOut: Boolean); stdcall;

Jetzt zur Anwendung des ganzen:

ich habe einen Dienst und mit der folgenden Funktion starte ich den Dienst
Delphi-Quellcode:
procedure TTMService.ServiceStart(Sender: TService; var Started: Boolean);
   begin
      //hier Aufruf des Threads
      TMThread:= TMThread.Create(false);
   end;

Dann habe ich meinen Thread:
Delphi-Quellcode:
constructor TMThread.Create(CreateSuspended: Boolean);
  begin
    inherited Create(CreateSuspended);
    Priority := tpLowest;
    //Hier käme dann CreateTimerQueueTimer() hin?
  end;
Dann gibt es dort die Methode Execute: Hier soll zuerst die Methode FormCreate durchgeführt werden, und danach so die Methode TimerTimer aufgerufen werden, dort wird der Timer dann jeweils enabled = true oder false, je nach Arbeitsschritt. Der Timer ist zu Anfang der Methode erst mal enabled:= false; Wie muss ich das ganze jetzt ändern? Und bleibt der Aufruf der Methode Execute so oder muss ich daran etwas ändern? Kann ich dann schreiben if not Terminated then und dann die Funktion, die Timergesteuert ist? Und dann sollte er die Funktion immer in vorgegebenen Abständen aufrufen?
Delphi-Quellcode:
procedure TMThread.Execute;
   begin
      FormCreate;
      while not Terminated do
         TimerTimer(self);
      Timer.Free;
      ClockTimer.Free;
   end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:04 Uhr.
Seite 1 von 2  1 2      

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