Entwickler-Ecke
Sonstiges (Delphi) - Nicht visueller timer
klezmor - Do 13.10.05 16:41
Titel: Nicht visueller timer
- 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?
- 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
Tino: 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.
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
Amateur 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);
end. |
MFG Klezmor.
Moderiert von
Christian 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 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
FaTaLGuiLLoTiNe 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
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?
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?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!