Entwickler-Ecke

Sonstiges (Delphi) - Nicht visueller timer


klezmor - Do 13.10.05 16:41
Titel: Nicht visueller timer
  1. Ich will ein Programm schreiben, dass alle paar minuten einen befehl ausführt, es sollte allerdings keine graphische Oberfläche besitzen. Anfangs habe ich mit dem Befehl sleep gearbeitet, dieser scheint jedoch nicht sehr geeignet, da das Programm öfters abstürzte.

    gibt es so etwas wie einen nicht visuellen timer, ich könnte ja z.B. zur Laufzeit mit dem Befehl: timer1:=ttimer.create(application); einen Timer erstellen, aber wo schreibe ich nun die routine hinein, die alle paar minuten ausgeführt werden soll?
  2. Noch eine weitere Frage, wie kann ich eine Routine zu einer bestimmten systemzeit aufrufen? Den Befehl, der mir die Aktuelle Zeit ausgibt kenne ich.

    Bisher durchlief mein Programm eine endlosschleife, die durch einen sleep befehl abgebremst wurde und dann die sysstemzeit mit der von mir angegebenen zeit verglich. Dies scheint mir jedoch sehr ressourcenkostspielig zu sein, und das Programm hatte auch eine sehr starke cpu auslastung. Könnte man dies nicht irgendwie ereignisorientierter lösen, so wie bei einem buttonklick?
MFG Klezmor

Moderiert von user profile iconTino: List- und Delphi-Tags hinzugefügt.


digi_c - Do 13.10.05 16:47

1. DU schreibst dir eine methode die genauso aufgebaut ist wie die die normalerweise vorgegeben ist OnTimer oder so und bindest sie per Timer.OnTimer an...

2.Evtl. könntest du Hooks per WinAPI auslegen oder ein Ereignis in den Windows Taskplaner eintragen lassen.


retnyg - Do 13.10.05 16:51

Suche in: Delphi-Forum, Delphi-Library CREATETHREAD TIMER


Delete - So 16.10.05 23:43

Timer in einer Konsolen-Anwendung: http://www.luckie-online.de/Developer/Delphi/Sonstiges/Timer_in_Konsole.html

@digi_c: Was hat denn das mit Hooks zu tun?


Amateur - So 16.10.05 23:53

@ luckie: ne frage zu dem code bei dem link. wozu wird der PMethodPointer auf den TMethodPointer definiert? denn der kommt sonst nirgendwo mehr vor...


Delete - Mo 17.10.05 00:30

Meinst du das hier:

Delphi-Quelltext
1:
PMethodPointer = ^TMethodPointer;                    

Angewohntheit.


Amateur - Mo 17.10.05 13:59

genau das mein ich. hat ja keine bedeutung für das programm oder?


retnyg - Mo 17.10.05 14:02

user profile iconAmateur hat folgendes geschrieben:
genau das mein ich. hat ja keine bedeutung für das programm oder?

doch, man hat den typisierten pointer nämlich schon definiert, wenn man den mal brauchen sollte


Delete - Mo 17.10.05 14:16

In dem Code oben nicht. Aber wie schon retnyg sagt, wen man ihn doch mal braucht, hat man ihn schon. ;)


Amateur - Mo 17.10.05 14:22

ok alles klar... war nur aus interesse weil ich auch dabei bin mich in pointer und so einzuarbeiten....


Lossy eX - Mo 17.10.05 14:38

Nennt mich kleinlich aber das Gewurschtel mit den Pointern kann man recht einfach verhindern in dem man Objekt orientiert arbeitet. ;-) Außerdem ist man dann Windowskompatibel falls man vor hat Teile der Quellen wieder zuverwenden oder doch eine GUI braucht.


klezmor - Mo 17.10.05 21:00

ich versteh den code nicht so ganz, wenn ich einfach nur ne timerroutine benötige, in der z.B. alle 5s etwas ausgeführt wird, brauche ich dann den ganzen code?


Delete - Mo 17.10.05 22:09

Probiers aud und lass, weg was du meinst, man weg lassen könnte. :roll:


BenBE - Mo 17.10.05 22:16

@2. Geht rein theoretisch über den Task-Scheduler von Windows ... Rein praktisch ist der bei mir deaktiviert, weil man damit zu nette Spielchen treiben kann ;-) Der Taskplaner (auf Windows-Deutsch) ist allerdings nicht trivial zu nutzen und außerdem stark mit Verzögerungen behaftet ...

@1. Wie meine Vorredner sagen: Hatten wir alles schonmal ;-)


klezmor - So 18.12.05 15:38

ich hab das immer noch nicht gecheckt, das problem, dass sich ergibt, ist ein allgemeines, das es eigentlich für alle komponenten gibt, wenn ich sie nicht visuell einsetzen will.
so sieht der code bis jetzt aus, und wie geht es weiter?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
program Project2;
uses
   Windows, Messages, SysUtils, Variants, Classes, Controls,forms,
  Dialogs,ExtCtrls;

var mytimer:ttimer;
begin
mytimer:=ttimer.Create(application);

//hier jetzt Onmytimer hin oder wie funzt das?



end.


MFG Klezmor.

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt.


FaTaLGuiLLoTiNe - Mo 19.12.05 09:20


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
program Project2;

uses Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,
     Dialogs, ExtCtrls;

var myTimer: TTimer;

procedure myTimerOnTimer(Sender: TObject);
begin
 // Hier der Code der im OnTimer - Event ausgeführt werden soll.
end;

begin
 myTimer := TTimer.Create(Application);
 myTimer.OnTimer := myTimerOnTimer;
end.


Ich kann's gerade nicht testen aber ich glaube das dürfte funktionieren.


BenBE - Mo 19.12.05 11:15

user profile iconFaTaLGuiLLoTiNe hat folgendes geschrieben:
Ich kann's gerade nicht testen aber ich glaube das dürfte funktionieren.

Das kann nicht funzen, weil OnTimer ein TNotifyEvent ist, dass als Procedure of object deklariert ist.


klezmor - Mo 19.12.05 21:45

ja geht leider wirklich net.


BenBE - Di 20.12.05 14:34

Dann kann ich dich nur an die Suche in: Delphi-Forum, Delphi-Library FAQ INCOMPATIBLE METHOD POINTER verweisen ;-) Ansonsten hilft hier ein Blick in die Object Pascal Reference (Teil der DOH) ...


klezmor - Fr 23.12.05 00:11

Ich habe, versucht das in die tat umzusetzen, aber es funktioniert einfach nicht.
Kann mir den niemand einfach mal ein Beispiel zeigen, welches ich dann nachvollziehen könnte?
oder ist das so schwer?


Delete - Fr 23.12.05 11:06

Hast du schon mal auf den Link in meinem ersten Posting geklickt?


delfiphan - Fr 23.12.05 13:30

Alternativ gibt's noch diese Lösung:
http://www.delphi-forum.de/topic_Schleife+wird+nach+Eingabe+der+Sekunden+gestartet_53476.html

Natürlich dann ohne KillTimer im TimerProc.

PS: Dadurch fällt deine Endlosschleife trotzdem nicht weg. Irgendwas muss deine Applikation ja tun, z.B. auf User Input warten (Tastendruck o.Ä.), dass die Applikation wieder geschlossen werden soll.


klezmor - So 25.12.05 13:16

Ja ok ich dachte halt der timer würde auf irgendwelche windowsbotschaften reagieren aber scheint mir nicht so, da kann ich ja dan genauso gut ne funktion mit ner endlosschleife schreiben, die einen sleepbefehl von z.B. einer sekunde und ein application.processmessage hat oder?