| Autor |
Beitrag |
csigg
      
Beiträge: 706
WIn XP, Win NT, Win2000, Suse8.0
Delphi 5, Delphi 6
|
Verfasst: Di 10.05.05 07:40
Kennt jemand ne einfache kleine Scheduler Komponente, oder irgend ne andere Möglichkeit wie das Problem am besten zu Realisieren ist:
Ich hab ne Datenbank(interbase 6) und die will ich zu bestimmtem (am Programmstart bestimmbaren) Zeiten starten. Hatte bis jetzt ein Timer der jede Minute prüft ob die eingegebene Zeit mit der aktuellen Übereinstimmt, hattet bis jetzt aber nicht zuverlässig funktioniert.
Hat jemand ne Idee wie ich das am besten Lösen könnte.
Hier mal noch nen kleine Code-Abschnitt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TDatenbankVerwaltung.Timer1Timer(Sender: TObject); var Stunde: Word; Minute: Word; Sekunde: Word; MilliSekunde: Word; begin ShowMessage('Timer ausgelöst'); DecodeTime(now(), Stunde, Minute, Sekunde, MilliSekunde); if chbAktiv1.Enabled then begin if meStartzeit1.Text = intToStr(Stunde) + ':' + intToStr(Minute) then begin Timer1.Enabled := false; Timer1.Enabled :=true; Backup(edtDBNameZP.Text, edtDateiname1.Text); end; end; |
Ich befürchte dass das ganze an der If Abfrage liegt, da das ShowMessage, welches ich zu Testzwecken eingefügt habe mal jede Minute ausgelöst wird. Moderiert von Gausi: Topic aus VCL (Visual Component Library) verschoben am Di 10.05.2005 um 10:37
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Di 10.05.05 07:50
Du solltest das nicht als String vergleichen, sondern "echte" Zeitwerte.
Außerdem kein Vergleich auf Gleichheit.
Folgende Empfehlung:
Deine Startzeit rechnest du um in einen vollständigen Zeitpunkt mit Datum und Uhrzeit.
Dann kannst du
Delphi-Quelltext 1:
| if Zeitpunkt < Now then begin |
schreiben.
Das Problem ist nämlich, dass dein Programm ausgelastet sein könnte, wenn der Timer ausgelöst werden müsste. Dann kommt das ein paar Sekunden später und du hast Pech, weil dann nicht mehr die gleiche Minute läuft.
|
|
csigg 
      
Beiträge: 706
WIn XP, Win NT, Win2000, Suse8.0
Delphi 5, Delphi 6
|
Verfasst: Di 10.05.05 07:54
Ich hab den Fehler gefunden, der Vergleich heisst 08:44 = 8:44 und das erkennt er dan wohl nicht als gleichwertig, würde heissen, jeden morgen geht das Backup nicht *g*.
Das heisst ich muss ja praktisch dann halt die Uhrzeit bei der einmal aktiviert wurde löschen, sonst stimmt das kleiner ja immer bei allen schoon gebrauchten.
Ich hab glaub vergessen zu erwähnen dass die untere IF 6x vorkommt, da ich 6 Eingabefelder hab, für theoretisch 6 Backups am Tag.
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Di 10.05.05 08:00
csigg hat folgendes geschrieben: | Ich hab den Fehler gefunden, der Vergleich heisst 08:44 = 8:44 und das erkennt er dan wohl nicht als gleichwertig, würde heissen, jeden morgen geht das Backup nicht *g*.
Das heisst ich muss ja praktisch dann halt die Uhrzeit bei der einmal aktiviert wurde löschen, sonst stimmt das kleiner ja immer bei allen schoon gebrauchten.
Ich hab glaub vergessen zu erwähnen dass die untere IF 6x vorkommt, da ich 6 Eingabefelder hab, für theoretisch 6 Backups am Tag. |
Mach dir ein Array mit den aktuell gültigen Zeiten. Dies läufst du im Timer durch. Ist eins zutreffend, kannst du dort gleich den neuen Wert eintragen.
|
|
csigg 
      
Beiträge: 706
WIn XP, Win NT, Win2000, Suse8.0
Delphi 5, Delphi 6
|
Verfasst: Di 10.05.05 08:10
wie mach ich denn in delphi ein Array mit 6 Felder TTime??
*sorry ich komm von c++, da gibts kein TTime*
und noch ganz wichtig, ich muss das feld dynamisch machen, muss wenn alle 6 Eingabe-Felder bei mir aktiviert sind ein Array mit 6 Feldern erstellen, und bei jeden abgearbeiteten Feld muss dieses dann in der DB gelöscht werden, dass der selbe Auftrag nicht nochmal abgearbeitet wird.
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Di 10.05.05 08:28
Ich habe das so ähnlich gelöst (Source-Auszüge):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| type TEventRecord = Record Anwendung : ANSIString; StartDatum : TDate; StartZeit : TTime; Zeitpunkt : TDateTime; end;
Var EventArray : Array [0..5] of TEventRecord; EventArray : Array [0..5] of TDateTime; |
Dann musst du beim Programmstart dieses Array füllen.
Im Timer-Event musst du dann nur noch den Zeitpunkt prüfen und evtl. neu setzen.
csigg hat folgendes geschrieben: | | und noch ganz wichtig, ich muss das feld dynamisch machen, muss wenn alle 6 Eingabe-Felder bei mir aktiviert sind ein Array mit 6 Feldern erstellen, und bei jeden abgearbeiteten Feld muss dieses dann in der DB gelöscht werden, dass der selbe Auftrag nicht nochmal abgearbeitet wird. |
Also ein bisschen musst du schon noch selbst machen. Ich wollte das Programm nicht für dich schreiben. 
|
|
csigg 
      
Beiträge: 706
WIn XP, Win NT, Win2000, Suse8.0
Delphi 5, Delphi 6
|
Verfasst: Di 10.05.05 12:04
ich hab jetzt ein StringGRid genommen, das kann ich ja auch als Feld benutzen.
Hat jemand ne gut Idee wie ich nun das mit der Uhrzeit vergleichen kann, ich will nicht unbedingt alle angearbeiteten Zeilen löschen. Obwohl das vielleicht auch nicht so schlimm wäre
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Di 10.05.05 18:04
csigg hat folgendes geschrieben: | | ich hab jetzt ein StringGRid genommen, das kann ich ja auch als Feld benutzen. |
Ich rate dir immer noch davon ab, das ganze als String-Vergleich zu machen. Das müsstest du nämlich, wenn du direkt mit den Zellinhalten des StringGrids arbeitest.
Übrigens hat Windows einen eigenen Scheduler. Warum benutzt du den nicht?
Übrigens ist auf meiner HP im Download-Bereich eine Service-Demo, die genau das macht, worüber wir hier diskutieren. Ob du allerdings meinen Service verwenden willst oder den Windows-Scheduler ist wohl ziemlich egal.
|
|
csigg 
      
Beiträge: 706
WIn XP, Win NT, Win2000, Suse8.0
Delphi 5, Delphi 6
|
Verfasst: Mi 11.05.05 07:34
also ich vergleiche jetzt auf <. Das passt soweit ganz gut, allerdings muss ich jetzt halt alle abgearbeiteten Aufträge löschen, und dazu sollte ich wissen wie ich aus dem StringGrid eine Zeile löschen kann.
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 11.05.05 07:45
|
|
csigg 
      
Beiträge: 706
WIn XP, Win NT, Win2000, Suse8.0
Delphi 5, Delphi 6
|
Verfasst: Mi 11.05.05 07:58
hab bei Google schon einiges gefunden gehabt, danke.
|
|
csigg 
      
Beiträge: 706
WIn XP, Win NT, Win2000, Suse8.0
Delphi 5, Delphi 6
|
Verfasst: Mi 11.05.05 11:49
Wo find ich denn infos zu dem Windows scheduler??
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 11.05.05 11:51
Findest du bei XP so:
Start->Alle Programme->Zubehör->Systemprogramme->Geplante Tasks
|
|
csigg 
      
Beiträge: 706
WIn XP, Win NT, Win2000, Suse8.0
Delphi 5, Delphi 6
|
Verfasst: Mi 11.05.05 11:54
kann ich den denn von Delphi aus auch benützen??
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 11.05.05 12:13
Habe ich noch nicht versucht. Könnte ich mir aber gut vorstellen, dass das möglich ist. Schon mal google gefragt? Vielleicht gibts auch einen API-Call.
[LAUTES_RUFEN]Hey Luckie! Weißt du da was?[/LAUTES_RUFEN]
|
|
csigg 
      
Beiträge: 706
WIn XP, Win NT, Win2000, Suse8.0
Delphi 5, Delphi 6
|
Verfasst: Mi 11.05.05 12:16
google hat gemeint es weiss nix sinnvolles. Soll ich mal das Oracle von Delphi (wahnsinn gelich 2 Programme) fragen *g*.
|
|