SYSTEMTIME
-
Hallo!
ich schreib gerade eine Funktion, die von einer Uhrzeit ein bestimmtes Zeitintervall abziehen soll. Dieses Intervall wird in Sekunden übergeben. Als Hilfestellung hab ich mir ein Tutorial auf Codeguru angeschaut (http://www.codeguru.com/mfc/comments/32949.shtml), in welchem zwei Uhrzeiten voneinander abgezogen werden, und die Differenz ermittelt wird.
Das ganze funktioniert auch soweit, doch irgendwie hab ich noch nicht rausgefunden, wie ich die übergebenen Sekunden umwandeln soll, damit diese von der aktuellen Uhrzeit abgezogen werden können?SYSTEMTIME sysEndTime, sysStartTime; GetLocalTime(&sysEndTime); sysEndTime.wHour -= 1; FILETIME ftStartTime, ftEndTime; SystemTimeToFileTime(&sysEndTime, &ftEndTime); ULARGE_INTEGER endTime = *(ULARGE_INTEGER*)&ftEndTime; ULARGE_INTEGER diffSec = *(ULARGE_INTEGER*)&iSeconds; // hier stehen die Sekunden drin. __int64 i64endTime = *(__int64 *)&endTime; __int64 i64diffsec = *(__int64 *)&diffSec / 1000000; __int64 i64startTime = (i64endTime - i64diffsec); // und hier möcht ich sie von der aktuellen Zeit abziehenZB aus 900 Sekunden werden 53 Sekunden. Also denk ich mal dass bei der umwandlung von iSeconds was schief geht!?
Ich hoffe ihr versteht mich und vielleicht kann mir jemand helfen!
Vielen Dank
MfG
Sebastian
-
Du nimmst einfach deine SYSTEMTIME-STRUKTUR und wandelst sie über FILETIME in ULARGE_INTEGER um. Jetzt kannst du einfach den entsprechenden Zeitbetrag (in 100ns Intervallen) abziehen. Anschließend die ganze Umwandlung wieder rückgängig und du hast die gewünschte Zeit

-
Okay soweit so gut

Hab jetzt SYSTEMTIME -> FILETIME -> ULARGE_INTEGER damit ich überhaupt erstmal
mit den Zeiten rechnen kann. Also so:SYSTEMTIME sysEndTime, sysStartTime; GetLocalTime(&sysEndTime); FILETIME ftStartTime, ftEndTime; SystemTimeToFileTime(&sysEndTime, &ftEndTime); ULARGE_INTEGER endTime = *(ULARGE_INTEGER*)&ftEndTime; //soviel zur Umwandlung meiner Zeit //und jetzt den Zeitintervall abziehen __int64 i64endTime = *(__int64 *)&endTime; __int64 i64seconds = iSeconds * 10000000; //z.B. iSeconds=900; dann mal 10^-7, da 100ns, oder?!? __int64 i64startTime = (i64endTime - i64seconds);Oder wo sonst soll ich von Sekunden in Nanosekunden umwandeln?
Weil so werden nur ein paar Sekunden abgezogen?!Dankeschön.
-
Also bei mir läuft dein Code wie erwartet. Du musst eben nur noch i64startTime wieder zurück in einen SYSTEMTIME wandeln. Wenn nur ein paar Sekunden abgezogen werden hast du wohl in iSeconds auch nur ein paar angegeben :p
-
Okay danke erstmal!
Aber bei mir gibt er mit diesem Code was anderes aus:
SYSTEMTIME sysEndTime, sysStartTime; GetLocalTime(&sysEndTime); sysEndTime.wHour -= 1; FILETIME ftStartTime, ftEndTime; SystemTimeToFileTime(&sysEndTime, &ftEndTime); ULARGE_INTEGER endTime = *(ULARGE_INTEGER*)&ftEndTime; __int64 i64endTime = *(__int64 *)&endTime; __int64 i64seconds = iSeconds * 10000000; __int64 i64startTime = (i64endTime - i64seconds); ftStartTime = *(FILETIME*)&i64startTime; FileTimeToSystemTime(&ftStartTime, &sysStartTime); // hier lass ich mir die Zeiten mal anzeigen char szStartTime[32], szEndTime[32]; GetTimeFormat(LOCALE_SYSTEM_DEFAULT, TIME_FORCE24HOURFORMAT, &sysEndTime, "hh':'mm':'ss", szEndTime, sizeof(szEndTime)); GetTimeFormat(LOCALE_SYSTEM_DEFAULT, TIME_FORCE24HOURFORMAT, &sysStartTime, "hh':'mm':'ss", szStartTime, sizeof(szStartTime));Zeig dir mal die Werte ausm Debug:
iSeconds = 900;
i64seconds = 410065408;Ja und die endTime is ja eh verschieden

Und mit diesen Werten werden bei mir nur 41sec abgezogen?!Oder ist bei meiner Umwandlung zurück was falsch?
Im Endeffekt benötig ich nur die Sytemtimes.Vielleicht kannst du das nochmal checken.
Gruß
-
Hatte es nur mit kleinen Werten getesten - du darfst nicht einfach iSeconds * 10000000 schreiben

1.) sysEndTime.wHour -= 1; rausnehmen
2.) Int32x32To64(iSeconds,10000000);
-
Okay super vielen Dank für deine Info!
Hab beim testen eben auch gemerkt, dass die Funktion mit kleinen Zahlen geht,
jedoch nicht wenn der Wert größer als 32bit wird. Gut dass du mir diese Funktion
gesagt hast, die kannte ich nämlich noch nicht!!!Vilen Dank, jetzt funzt alles!
Bis denn
Gruß
Sebastian