Forum: PC-Programmierung Datum/Uhrzeit im DOS Fenster, Datum bleibt stehen??


von B. J. (bjue)


Lesenswert?

Hallo,
ich habe für ein DOS Terminalprogramm (Crosstalk MK.4) ein Script 
geschrieben, welches Daten in eine Datei abspeichert und mit Zeitstempel 
versieht. Wenn ich das über Nacht laufen lasse, findet kein 
Datumswechsel statt! Die Uhr läuft anscheinend weiter.
Wenn ich in einem anderen DOS Fenster mit date oder time oder auch in 
Windows (WinXP) das Datum und die Zeit ändere, wird dies nicht im 
laufenden DOS Programm übernommen, dort läuft die Uhrzeit ohne Änderung 
weiter.

Den gleichen Effekt habe ich mit einem uralten DOS Programm in C, 
welches u.a. Datum und Zeit in der Statuszeile anzeigt. Hier der Source 
Code dazu:
struct tm *PoiTime;
long ltime;

time(&ltime);
PoiTime = localtime(&ltime);
ActHour = PoiTime->tm_hour;
ActMin = PoiTime->tm_min;
ActSec = OldSec = PoiTime->tm_sec;
ActDay = PoiTime->tm_mday;
ActMon = PoiTime->tm_mon+1;
ActYear = PoiTime->tm_year;

Stoppe ich die Programme und frage Datum und Zeit in der jeweiligen DOS 
Box ab, stimmt wieder alles.

Frage: Wird für ein einmal gestartetes DOS Programm in einer DOS Box 
(cmd.exe) eine eigene Uhr ohne Datumsweiterschaltung simuliert???

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Zunächst einmal: cmd.exe ist kein "DOS-Fenster", was dort läuft und auf 
Deine Eingaben "date" und "time" reagiert, ist auch kein DOS, sondern 
eine 32-Bit-Konsolen-Applikation, die rein zufälligerweise auch ein paar 
DOS-Kommandos versteht (und die meisten mit zusätzlichen Fähigkeiten 
auch noch ganz massiv aufgebohrt hat).

Wenn Du in einem solchen Fenster ein DOS-Programm startest (ein 
DOS-Programm ist ein 16-Bit-Programm), dann wird ein Prozess namens 
NTVDM gestartet, der eine virtuelle DOS-Umgebung zur Verfügung stellt. 
Dein DOS-Programm bekommt von dieser Umgebung eine standardisierte 
PC-Hardware vorgegaukelt.

Wenn Du aber Dein DOS-Programm beendest, beendet sich auch NTVDM, und 
Deine vermeintlichen DOS-Befehle "date" und "time" werden wieder von 
cmd.exe ausgewertet -- das lässt also keinerlei Rückschluss auf das 
Zeitverhalten innerhalb von NTVDM zu.

Um das zu testen, musst Du in cmd.exe command.com aufrufen und dann erst 
Dein DOS-Programm bzw. Deine Testkommandos.

Wenn Du Dir eine Verknüpfung auf command.com erstellst, kannst Du Dir 
mal die Eigenschaften der Verknüpfung ansehen, dort wird unter 
"Programm" ein Knopf "Erweitert" angeboten, mit dem unter anderem eine 
"kompatible Timerhardwareemulation" aktiviert werden kann.
Desweiteren gibt es unter "Sonstiges" eine Checkbox "Immer aussetzen", 
die Du vermutlich deaktivieren solltest.

von B. J. (bjue)


Lesenswert?

Vielen Dank erst einmal für die ausführliche Antwort!
Ich habe jetzt alle 4 Kombinationen ("kompatible Timerhardwareemulation" 
und "Immer aussetzen") in der Verknüpfung auf command.com getestet. Es 
bleibt dabei: Uhrzeit wird richtig emuliert, Datum bleibt stehen.
Also gehe ich erst mal davon aus, dass NTVDM das Datum um 00.00 Uhr 
nicht weitersetzt.
(In meinem Script schalte ich das Datum nun eben selbst weiter.)

von Severino R. (severino)


Lesenswert?

Es gibt im PC-Bios (oder in DOS, bin mir nicht mehr sicher) eine Art 
Bug, und zwar wird das Datum nicht automatisch weitergeschaltet. Beim 
Abfragen der Zeit gibt es ein Bit "Midnight rollover", das ausgewertet 
werden muss, um das Datum zu inkrementieren.
Das Bit wird nach dem Lesen der Zeit automatisch gelöscht.
Der Befehl TIME führt diese Korrektur wohl aus.
Wird die Zeit anders ausgelesen als mit den BIOS- resp. DOS-INT, so 
bleibt die Korrektur wohl aus.
Vielleicht hat MS dieses Verhalten auch in NTVDM eingebaut, da ja alles 
kompatibel bleiben muss.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.