Wird die Performace ausgebremst???
-
Hallo,
mich beschäftigt seit einiger Zeit folgende Frage:Ich habe in meinem Programm einen Thread, der alle 200ms die Systemzeit abfragt. Diese benötige ich unter anderem dazu, um am 01.Januar eines jeden Jahres einen bestimmten Wert in meiner DB zu ändern. Dies darf aber nur ein mal im Jahr erfolgen!!! Um das zu realisieren, wollte ich die Registry zur Hilfe nehmen. Hier mein Lösungsvorschlag:
Registrywert_lesen(); Datum_zerlegen(); if ( Datum >= 01.Jan && Datum <= 01.Feb) //nur den Januar berücksichtigen, falls das Prog. erst später gestartet wird { if (!Reg_Wert) { DB_Wert_aendern(); Reg_Wert_setzen(); } } else Reg_Wert_löschen();Meine Frage lautet nun, da ich ja alle 200ms einen Wert aus der Registry lesen muß, bricht Aufgrund der Lesevorgänge evtl. die Performance des PCs zusammen??? Sollte man evtl. einen anderen Lösungsweg suchen???
MfG Torsten
-
1. Mangelt es deiner Erklärung samt Codebeispiel ein wenig an Ausführlichkeit.
2. Verstehe ich nicht warum du extra einen Thread bemühst wenn du auch genauso gut einen Timer nehmen könntest dessen Abweichung du ab und zu korrigierst.
(Edit: Hat ein Timer überhaupt eine größere Abweichung als so eine Thread-Methode? Klärt mich bitte auf.)
3. Hört sich dein Datenbankmodell so an als wäre es sehr anfällig für Anomalien.
4. Warum liest du den Registry-Wert nicht erst innerhalb des if's aus?
Also so:Datum_zerlegen(); if ( Datum >= 01.Jan && Datum <= 01.Feb) //nur den Januar berücksichtigen, falls das Prog. erst später gestartet wird { Registrywert_lesen(); if (!Reg_Wert) { DB_Wert_aendern(); Reg_Wert_setzen(); } } else Reg_Wert_löschen();Das würde schon mal enorm Performance sparen.
5. Glaube ich, dass dein else an der falschen Stelle steht. Das würde bedeuten, dass du den Registry-Wert das ganze Jahr über löscht
6. Würde es nicht reichen beim Programmstart einmal festzustellen ob der Wert in der Registry steht, ihn dann nurnoch innerhalb des Programms zu verwalten und am Ende wieder in die Registry zu speichern?
Falls nein ist TMemIniFile glaube ich eher was du suchst.
*sigh*
-
Zu 1: Den Code habe ich auf die Schnelle aus dem Kopf heraus getippt (nur zum Verständniß) und was fehlt denn noch an
Ausführlichkeit?Zu 2: Der Thread ist ja schon Vorhanden (zum Anzeigen der aktuellen Uhrzeit). Bei einem Timer wird der Programmablauf
durch das abarbeiten des Codes im Timer unterbrochen. Dadurch stockt das Programm. Ein Thread hingegen arbeitet Parallel zum Programm...Zu 3: Das DB-Modell ist OK!!! Es sollen lediglich ca.80 Datensätze so geändert werden, das eine fortlaufende Nummer am
Jahresanfang auf Null gesetzt wird!Zu 4: Da ist was wahres drann

Zu 5: Da stellt sich dann die Frage, wann das Programm den Reg-Wert wieder auf 0 setzen soll? Es muß ja gewährleistet sein,
das die Werte im folgenden Jahr wieder auf 0 gesetzt werden müssen!Zu 6: Folgender Fall: Das Programm wird am 31.12.2006 22°° gestartet und zum Jahreswechsel NICHT beendet. Da im neuen Jahr
(das ja jetzt ein paar Minuten alt ist...) aber die Fortlaufenden Nummern mit 0 beginnen müssen, bekommt das Programm ja
nicht mit, das es sich nun um ein neues Jahr handelt!Soweit meine Antworten. Ich habe aber noch ein wenig Brainstorming betrieben und bin dann auf folgenden Lösungsweg gekommen:
Da ich ja die Zeit ständig abfrage (im Thread), kann man doch prüfen, ob es nun der 01.01.20xx 00:00:01 ist. Wenn ja,
wird das Programm beendet (Close())! Wenn der User es nun neu startet, kommt Pkt.6 zum Zuge...MfG
-
Alle 200ms die Zeit abzufragen ist doof.

Einmal zum Programmstart sollte reichen, da kannst du das Timerintervall so setzen, dass es genau auf den 01.01. fällt. Unerwartete Änderungen der Systemzeit fängst du über ein selbst implementiertes Event ab (s.u.), dort kannst du dein Intervall entsprechend anpassen.http://groups.google.com/group/borland.public.cppbuilder.winapi/browse_thread/thread/f43fcd9b5586c39b/e627189f14ebf59a?lnk=st&q=ontimechange+window+group%3Aborland.public.*&rnum=1&hl=de#e627189f14ebf59a