Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Service & on Execute (https://www.delphipraxis.net/160218-service-execute.html)

value is NULL 3. Mai 2011 09:19

Service & on Execute
 
Hi Delphianer

Ich spiele mich derzeit damit, einen Service zu erstellen. Ich habe ziemlich viel gelesen über Timer im onExecute Event.
unter anderem folgendes: http://blubplayer.de/tutorials/TimerTutorial.pdf

Gibt es eine "einfache" Möglichkeit einen Timer zu machen?

Ich möchte prakitsch alle 5 Minuten ein paar dinge tun.

Danke schon mal im Voraus.

LG

-187- 3. Mai 2011 09:21

AW: Service & on Execute
 
TTimer ?

value is NULL 3. Mai 2011 09:42

AW: Service & on Execute
 
hast du da ein gutes tutorial für mich?

DeddyH 3. Mai 2011 09:48

AW: Service & on Execute
 
Ein Tutorial zu TTimer? Was soll da denn drinstehen, was nicht in dem von Dir verlinkten bereits gesagt wurde?

-187- 3. Mai 2011 09:56

AW: Service & on Execute
 
Ich glaube du gehst da zu kompliziert dran. Platziere doch mal den TTimer auf deiner Form. Folgende Einstellungen sind nötig (OI oder Form Create)

Timer1.Enabled:=True;
Timer1.Interval:=1000;

im OnTimer Ereignis schreibst du jetzt ShowMessage('jede sekunde kommt diese Nachricht');

:thumb:

DeddyH 3. Mai 2011 09:58

AW: Service & on Execute
 
ShowMessage in einem Service ist aber nicht die beste Idee :zwinker:

-187- 3. Mai 2011 10:00

AW: Service & on Execute
 
Ich wollte auch nicht sein Problem lösen, sondern zeigen wie einfach TTimer funktioniert :) Der Rest sollte alleine zu schaffen sein.

value is NULL 3. Mai 2011 10:11

AW: Service & on Execute
 
im prinzip schaut das ja gut aus, aber ich verstehe nicht wie ich das im code verwende, sprich welche uses ich dazu benötige :(

DeddyH 3. Mai 2011 10:12

AW: Service & on Execute
 
TTimer ist in ExtCtrls deklariert.

-187- 3. Mai 2011 10:14

AW: Service & on Execute
 
Wenn du die Komponente auf die Form ziehst wird die Uses Clause automatisch erweitert.
Ansonsten kannst du auch manuell "ExtCtrls" einbinden und den Timer zur Laufzeit erstellen.

rollstuhlfahrer 3. Mai 2011 10:15

AW: Service & on Execute
 
Dein Dienst hat auch so was wie eine Form (weiß und man kann die Hintergrundfarbe nicht anpassen). Da ziehst du den Timer aus der Komponentenleiste drauf. Der ist übrigens unter System (der erste Eintrag). Um die USES brauchst du dich nicht zu kümmern, das macht Delphi selbst. Dann noch ein paar Einstellungen (wie beschrieben) tätigen und - ganz wichtig - die Ereignisprozedur anlegen (entweder durch Doppelklick auf den Timer oder ... (du weißt schon). -> Fertig

Bernhard

DeddyH 3. Mai 2011 10:22

AW: Service & on Execute
 
Zitat:

Zitat von -187- (Beitrag 1098515)
Wenn du die Komponente auf die Form ziehst wird die Uses Clause automatisch erweitert.

Nicht ganz, erst beim Kompilieren (zumindest bei mir).

Die Muhkuh 3. Mai 2011 10:24

AW: Service & on Execute
 
Zitat:

Zitat von DeddyH (Beitrag 1098518)
Zitat:

Zitat von -187- (Beitrag 1098515)
Wenn du die Komponente auf die Form ziehst wird die Uses Clause automatisch erweitert.

Nicht ganz, erst beim Kompilieren (zumindest bei mir).

Speichern reicht auch

-187- 3. Mai 2011 10:27

AW: Service & on Execute
 
Genau :) Beim speichern, was man natürlich sehr häufig macht, wird die uses Clause erweitert.

value is NULL 3. Mai 2011 10:30

AW: Service & on Execute
 
Danke für die Antwort das klingt ja schon mal gut!!!

habe jetzt bei dem ServiceStart Event folgendes gemacht:

Delphi-Quellcode:
procedure Ttest.ServiceStart(Sender: TService; var Started: Boolean);
begin
  //Create LOGFILE
  createlog('test','C:\Temp');
  test_time.Create(nil);
  test_time.Enabled := True;
  test_time.Interval := 60000;
end;
Im on Execute habe ich jetzt folgendes:

Delphi-Quellcode:
procedure Ttest.ServiceExecute(Sender: TService);
begin
  while not terminated do
  begin
      if test_time.OnTimer = onTimer then begin
        // DO IT
      end;
  end;
end;
NATÜRLICH bekomme ich da einen Fehler, was habe ich falsch gemacht? :(

DeddyH 3. Mai 2011 10:38

AW: Service & on Execute
 
Delphi-Quellcode:
test_time := TTimer.Create(nil);
  test_time.Enabled := True;
  test_time.Interval := 60000;
  test_time.OnTimer := <Deine selbst geschriebene Methode vom Typ TNotifyEvent>;

value is NULL 3. Mai 2011 10:53

AW: Service & on Execute
 
ah ok

dh. bei test_time.ontime := <methode> ist der Timer erreicht?!

setzt er ihn dann automatisch zurück? bzw. wie würde meine service execute dann aussehen? so oder:

Delphi-Quellcode:
procedure Ttest.ServiceExecute(Sender: TService);
begin
  while not terminated do
  begin
    test_time.OnTimer := <methode>
  end;
  test_time.Free;
end;

Bummi 3. Mai 2011 10:58

AW: Service & on Execute
 
:?::?:

Was hast Du eigentlich vor?

rollstuhlfahrer 3. Mai 2011 11:01

AW: Service & on Execute
 
AUA. Sorry, aber ich würde dir an dieser Stelle ein Grundlagentutorial und eines für die Grundlagen von OOP mit Delphi empfehlen.

Du hast jetzt den Timer angelegt. Als weitere Eigenschaft musst du eine Prozedur erstellen (die natürlich eine Methode der Klasse sein muss (keine neue erstellen, du hast schon eine). Diese Prozedur weißt du dann Timer.OnTimer zu. Und dann entfernst du als nächstes mal ganz schnell die OnExecute-Prozedur aus deinem Dienst. Im Normalfall sollte man die nicht brauchen müssen.

Bernhard

Meta777 3. Mai 2011 11:16

AW: Service & on Execute
 
Was soll das eigentlich mit dem Timer?
der service hat ja nen Thread.
Folgender Code piept jede sekunde:

Delphi-Quellcode:
procedure Ttest.ServiceExecute(Sender: TService);
begin
  while not terminated do
  begin
    Beep;        //Oder ruf hier DEINE Methode auf
    Sleep(1000);
  end;
end;
Shalom

value is NULL 3. Mai 2011 13:11

AW: Service & on Execute
 
die idee ist ja recht cool und simpel aber wenn ich zB 5 Minuten warte bis ich wieder etwas tue, kann der Dienst nicht beendet werden. Hängt sich beim beenden jedes mal auf.

Jemand ne Idee?

PS: das einzige was ich vor habe ist, das ich zyklisch einen gewissen ablauf (Datenbankabfragen etc.) durchführe und danach ein paar minuten warte bis zum nächsten durchlauf

generic 3. Mai 2011 13:20

AW: Service & on Execute
 
Für regelmäßige Aufgaben gibt es in Windows die "geplanten Tasks".
-> siehe Systemsteuerung

Das sind einfache Programm/Skripte welche nach Regeln aufgerufen werden. z.B. mach mal alle 5 Minuten...

Das ist auch viel einfacher, als einen Dienst oder ähnliches hinzustellen.

value is NULL 3. Mai 2011 13:22

AW: Service & on Execute
 
nur das ich eine delphi console app als Service laufen lassen muss....

alfold 3. Mai 2011 13:25

AW: Service & on Execute
 
Hier noch ein simpler Vorschlag
nimm deinen timer, im timer dann:

Delphi-Quellcode:
Procedure Timer
begin
   inc(a);
end;


procedure Ttest.ServiceExecute(Sender: TService);
begin
  while not terminated do
  begin
    if a >= 10 then
    begin
       Beep; //Oder ruf hier DEINE Methode auf
       a:= 0;
    end;
 end;
end;
Gruss alfold

value is NULL 3. Mai 2011 13:33

AW: Service & on Execute
 
ach sch*** jetzt blick ich mich nicht durch...

kannst du mir das erklären damit ich das verstehe´?! :(

DeddyH 3. Mai 2011 13:35

AW: Service & on Execute
 
Wenn der Timer feuert, wird a um 1 erhöht. Hat a die 10 erreicht oder überschritten, wird ein Ton ausgegeben und a wieder auf 0 gesetzt, das Spiel beginnt also von vorn.

value is NULL 3. Mai 2011 13:44

AW: Service & on Execute
 
ja aber wann wird er hier erhöht?

Delphi-Quellcode:
procedure Ttest.ServiceExecute(Sender: TService);
begin
  while not terminated do
  begin
    if a >= 10 then
    begin
       Beep; //Oder ruf hier DEINE Methode auf
       a:= 0;
    end;
 end;
end;
müsste man hiern icht irgendwo a := a + 1 einbauen?

taveuni 3. Mai 2011 13:58

AW: Service & on Execute
 
Zitat:

Zitat von value is NULL (Beitrag 1098586)
die idee ist ja recht cool und simpel aber wenn ich zB 5 Minuten warte bis ich wieder etwas tue, kann der Dienst nicht beendet werden. Hängt sich beim beenden jedes mal auf.

Jemand ne Idee?

Delphi-Quellcode:
procedure Ttest.ServiceExecute(Sender: TService);
var
  c: Integer;
begin
  c:= 0;
  while not terminated do
  begin
    inc(c);
    if c:= 60 then
    begin
      // ruf hier DEINE Methode auf
      c:= 0;
    end;
    Sleep(1000);
  end;
end;

alfold 3. Mai 2011 13:58

AW: Service & on Execute
 
Nein zurückgesetzt!
Wenn der Timerinteval auf 1000 gleich (1sec) steht, wird jede sec a um 1 erhöht. (inc(a) entspricht a:=a+1;)
Ergo wird ca alle 10 sec der beep ausgelöst oder das was du da machen willst. Dann wird a wieder auf 0 gesetzt.
Nun dauert es wieder 10 sec und das spiel beginnt von vorn!

Hat @DeddyH doch geschrieben , oder war es nicht verständlich:gruebel:

Wenn es so ist, dann fehlen Dir aber die elementarsten Grundlagen.

Gruss alfold

rollstuhlfahrer 3. Mai 2011 14:05

AW: Service & on Execute
 
Da man einen Dienst nicht debuggen kann, würde ich mal empfehlen, zuerst eine Anwendung (mit graphischer Oberfläche) zu erstellen und dann mal alles zu implementieren, was du brauchst. Dann kannst du immer noch und ganz einfach alles in den Dienst reinkopieren und da du dir ja vorher sicher warst, dass es geht, geht es auch hinterher.

Zitat:

Zitat von value is NULL (Beitrag 1098588)
nur das ich eine delphi console app als Service laufen lassen muss....

Eine Konsolenanwendung hat im Normalfall nichts mit einem Dienst gemeinsam. Man kann das ungefähr so vergleichen: Du hast eine Fenster-Anwendung (GUI/VCL), bei der du das Fenster nicht siehst. Das Fenster ist auch nicht in der Lage, Fenster-Nachrichten zu erhalten (SendMessage geht also nicht). So und dass das jetzt noch zum Dienst wird, läuft das unter einem anderen Benutzerkonto (im Normalfall SYSTEM) und mit dessen Rechten.

Bernhard

value is NULL 3. Mai 2011 14:09

AW: Service & on Execute
 
hm... naja meine fragen mögen blöd klingen, bin aber ein selbst lerner dh. ich hab das weder in der schule noch sonst wo gelernt.
Hab schon ziemlich viel gemacht mit datenbanken, xml usw usw. Einen Timer habe ich bis dato noch nie benötigt und einen Service schon gar nicht.

ich finde die Sleep Methode einfach aber wie gesagt beim stoppen bekomme ich dann immer, das der Dienst nicht beendet werden kann, warscheinlich weil er sich in der sleep phase befindet oder? Deswegen werde ich wohl um einen Timer nicht rum kommen oder?

ich verstehe das prinzip den Timer einzubauen, das ich jedoch nicht weiß ist, was ich den Timer bei ttest_timer.ontime := ???? mitgeben muss. das ist ja praktisch der moment an dem heruntergezählt wurde oder?

rollstuhlfahrer 3. Mai 2011 14:11

AW: Service & on Execute
 
Dann klatsch doch einfach die Timer-Komponente auf dein Form. Dann einen Doppelklick drauf und dein Ereignis ist angelegt. Dann noch Intervall und Aktivität einstellen -> Fertig.

Ansonsten: Bei OnTimer muss der Name einer Prozedur rein, die du vorher angelegt hast.

Bernhard

alfold 3. Mai 2011 14:23

AW: Service & on Execute
 
Zitat:

Zitat von rollstuhlfahrer (Beitrag 1098611)
...Ansonsten: Bei OnTimer muss der Name einer Prozedur rein, die du vorher angelegt hast.
Bernhard

in den Vorschlag von mir nicht unbedingt.:wink:
Wenn er so macht wie mit den Beep 8-)

@value is Null! Bitte erst lesen, dann ausprobieren und wenn was nicht richtig geht wieder nachfragen!
Das hilft Dir mehr, als nur fragen ohne auszuprobieren!

Gruss alfold

value is NULL 3. Mai 2011 14:25

AW: Service & on Execute
 
^hm das mit dem timer drauf klatschen geht schon gut aber wie gesagt
ich weiß nicht wie ich das mit dem ontime in meinem onexecute event aufrufe

DeddyH 3. Mai 2011 14:29

AW: Service & on Execute
 
Wieso musst Du das Timer-Event im OnExecute aufrufen?

alfold 3. Mai 2011 14:31

AW: Service & on Execute
 
Zitat:

Zitat von value is NULL (Beitrag 1098619)
^hm das mit dem timer drauf klatschen geht schon gut aber wie gesagt
ich weiß nicht wie ich das mit dem ontime in meinem onexecute event aufrufe

Schau doch mal auf meinen Vorschlag. Da muss man nicht viel umsetzen, einfach nur machen!
Variable a: integer definieren, im Create setzten a:= 0;
Doppelcklick auf die Timerkomponente und das reinschreiben was da steht mehr nicht!

Gruss alfold

Bummi 3. Mai 2011 14:34

AW: Service & on Execute
 
:wall::wall::wall::wall::wall::wall:

rollstuhlfahrer 3. Mai 2011 14:37

AW: Service & on Execute
 
Wenn du eine entsprechend neue Delphi-Version hast, kannst du das mit .OnTimer auch mit einer anonymen Funktion versuchen :mrgreen::mrgreen: :

Delphi-Quellcode:
Timer.OnTimer = procedure(Sender: TObject); begin Beep; end;
Bernhard

ADD:
Zitat:

Zitat von Bummi (Beitrag 1098625)
:wall::wall::wall::wall::wall::wall:

Mir gehts genauso, aber es gibt ja sogar ganze 2 funktionierende Lösungsvorschläge.

Bummi 3. Mai 2011 14:47

AW: Service & on Execute
 
@rollstuhlfahrer
Ich hätte noch 2 andere Ansätze, aber damit braucht man in diesem Thread gar nicht erst kommen.
Zäääähhhh ....:roll:

value is NULL 3. Mai 2011 14:53

AW: Service & on Execute
 
îch steh trotzdem am schlauch :(


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:02 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