AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Timer klappt nicht in Dienst

Ein Thema von dingdoi · begonnen am 4. Sep 2004 · letzter Beitrag vom 20. Jan 2005
Antwort Antwort
Seite 1 von 2  1 2      
dingdoi

Registriert seit: 3. Aug 2004
Ort: Hamburg
26 Beiträge
 
Delphi XE2 Professional
 
#1

Timer klappt nicht in Dienst

  Alt 4. Sep 2004, 22:31
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.
  Mit Zitat antworten Zitat
stefan2005

Registriert seit: 30. Sep 2003
Ort: Puchheim
250 Beiträge
 
Delphi 6 Personal
 
#2

Re: Timer klappt nicht in Dienst

  Alt 4. Sep 2004, 22:35
Hi,
sry aber ich versteh nicht ganz, wie du das mit "dem Dienst" meinst ?
  Mit Zitat antworten Zitat
djmasi

Registriert seit: 9. Jun 2004
Ort: Leipzig
105 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Timer klappt nicht in Dienst

  Alt 4. Sep 2004, 22:37
Ich denke mal er will es als Systemdienst laufen lassen.

@dingdoi: schau Dir mal die Tutorials von Luckie an
Thomas Maßmann
"...ihr würdet selbst den lieben Gott einbetonieren, wenn eure Datenbank ihn eines Tag's erfasst..."
H.-R.-Kunze
Auch Delphi 9 Preview-Inhaber bin
  Mit Zitat antworten Zitat
Benutzerbild von Duffy
Duffy

Registriert seit: 19. Mär 2003
Ort: Wuppertal
835 Beiträge
 
Delphi 3 Standard
 
#4

Re: Timer klappt nicht in Dienst

  Alt 4. Sep 2004, 22:39
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
Künftige Generationen wollen ihre Fehler selber machen.
Jedes Programm wird nie das können, was Du wirklich brauchst.
Das Gegenteil von gut ist gut gemeint
-----
  Mit Zitat antworten Zitat
dingdoi

Registriert seit: 3. Aug 2004
Ort: Hamburg
26 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Timer klappt nicht in Dienst

  Alt 4. Sep 2004, 22:48
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Timer klappt nicht in Dienst

  Alt 5. Sep 2004, 04:08
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
dingdoi

Registriert seit: 3. Aug 2004
Ort: Hamburg
26 Beiträge
 
Delphi XE2 Professional
 
#7

Re: Timer klappt nicht in Dienst

  Alt 5. Sep 2004, 15:39
@Luckie: Klasse, mit CREATETIMERQUEUETIMER funktioniert es. Danke!
  Mit Zitat antworten Zitat
Susanne

Registriert seit: 21. Mai 2004
Ort: Lage
232 Beiträge
 
Delphi 2005 Professional
 
#8

Re: Timer klappt nicht in Dienst

  Alt 18. Jan 2005, 14:24
Zeig mal wie du das mit CREATETIMERQUEUETIMER gemacht hast, das würde mich brennend interessieren
Susanne
  Mit Zitat antworten Zitat
dingdoi

Registriert seit: 3. Aug 2004
Ort: Hamburg
26 Beiträge
 
Delphi XE2 Professional
 
#9

Re: Timer klappt nicht in Dienst

  Alt 19. Jan 2005, 20:54
Ich hoffe, dieses kleine Beispiel hilft dir weiter.

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;

...
  Mit Zitat antworten Zitat
Susanne

Registriert seit: 21. Mai 2004
Ort: Lage
232 Beiträge
 
Delphi 2005 Professional
 
#10

Re: Timer klappt nicht in Dienst

  Alt 20. Jan 2005, 09:57
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?
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;
Susanne
  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 00:51 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