Hilfe bei "Stopuhr-Projekt"
-
Was gibt er hier aus, wenn du folgendes machst:
GetLocalTime(&st); std::cout << GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, NULL, sz, (sizeof(sz) / sizeof(sz[0]))) << "\n";
-
Da gibt er die Zahl 9 aus und zwar immer...schon komisch
-
Nein, das ist völlig korrekt. Die Funktion gibt die Anzahl der TCHARs zurück, die in sz geschrieben werden.
Es müssen auch 9 sein.
HH:MM:SS + \0
-
Vielleicht doch ein fehler mit der Null Terminierung.
Schreib mal:
std::cout << GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, NULL, sz, (sizeof(sz) / sizeof(sz[0]))) << "\n"; sz[8]='\0';
-
Ja ok...aber das bringt mich jetzt der Zeit trotzdem kein Stück näher oder?
-
Hste nun sowas hier??:
16:24:05
Damit haste doch die Systemzeit.
Nun mußte nur deine Millisekunden auf die Sekunden und Minuten oder Stunden aufaddieren.
Dfür mußte den SystemZeit String in seine einzelnen Zahlen zerlegen.
Also an den ':' kappen.Also
16
24
05Dann Millisekunden / 1000 = Sekunden.
Das Ganze dann in Stunden Minuten und Sekunden umrechnen und auf die entsprechenen Teile der Systemzeit aufaddiren.
Das ist doch nur ein wenig Mathematik.Fertig.
-
Irgendwie stehe ich gerade auf dem Schlauch...
Hier nochmal mein Code:
#include <windows.h> #include <iostream> #include <time.h> int main() { //Variablen LONGLONG g_Frequency, g_CurentCount, g_LastCount; SYSTEMTIME st; TCHAR sz[128]={0}; GetLocalTime(&st); //GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, NULL, sz, (sizeof(sz) / sizeof(sz[0]))); //Frequenz holen if (!QueryPerformanceFrequency((LARGE_INTEGER*)&g_Frequency)) std::cout << "Performance Counter nicht vorhanden" << std::endl; //1. Messung QueryPerformanceCounter((LARGE_INTEGER*)&g_CurentCount); Sleep(10); // Sleep ist ungenau, darum wird nicht 10ms herauskommen //2. Messung QueryPerformanceCounter((LARGE_INTEGER*)&g_LastCount); double dTimeDiff = (((double)(g_LastCount-g_CurentCount))/((double)g_Frequency)); std::cout << "Zeit: " << dTimeDiff << std::endl; std::cout << "Zeit: " << g_LastCount << std::endl; std::cout << "Zeit: " << g_CurentCount << std::endl; std::cout << "Zeit: " << g_Frequency << std::endl; sz[8]='\0'; std::cout << GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, NULL, sz, (sizeof(sz) / sizeof(sz[0]))) << "\n"; std::cout << "Zeit: " << sz << std::endl; std::cin.get(); return 0; }Ob "sz[8]='\0';" nun davor oder danach oder gar nicht da steht spielt keine Rolle bei der Ausgabe der Ergebnisse. Ich erhalte in der obigen Form nur eine Hexadezimalzahl. Gebe ich die die Felder einzeln aus, also sz[0], sz[1]...etc., dann komme irgendwelche Zahlen raus (meistens zwischen 50 und 60), die aber nichts mit der Uhrzeit zu tun haben. Ich bin verwirrt^^
-
Scheint, als ob dein System irgendwie den Textstring als Zahlen ausgibt.
Seltsam. Vielleicht liegt es am Compiler.Bei mir läuft es einwandfrei.
-
Ich habe den Fehler:) Man muss den Zeichensatz von Unicode auf Multibyte umstellen...;-)
-
So umwandeln der Systemzeit in Zahlen:
int stunde, minute, sekunde; int nCnt = sscanf(sz, "%d:%d:%d",&stunde, &minute, &sekunde); if(nCnt != 3) { std::cout << "Falsches Format\n"; } std::cout << stunde << " " << minute << " " << sekunde << "\n";
-
Dann deine Sekunden in Stunden, Minuten und Sekunden umrechnen, auf die entsprechenden Variablen aufrechnen und wieder in ein Uhrzeitformat umwandeln.
Die Millisekunden noch hinten dranhängen.
Fertig.
-
Danke für die Hilfe...
Eine Frage hätte ich noch...wenn ich die Zeit permanent anzeigen lassen möcht, bräuchte ich sowas wie eine Endlos-For-Schleife, die ständig die Zeit berechnet und ausgibt? Wie muss ich das lösen?
-
Wäre es vielleicht eine Lösung, die Anweisungen in die "Paint-Nachricht" der Callback zu schreiben?
-
Nimm einen Timer. Die Berechnung kann dann im WM_TIMER-Zweig erfolgen bzw. es findet der Funktionsaufruf statt. Anschließend wird der Bereich der Ausgabe im Fenster für ungültig erklärt und neu gezeichnet.
(die Begriffe, die du brauchst sind SetTimer & KillTimer, WM_TIMER, InvalidateRect).
-
Das würde ich mit WM_TIMER machen.
Da kannste eine Funktion hinterschalten, die in einstellbaren Intervallen ausgeführt wird.
Dabei übernimmt Windows die komplette Steuerung.Zunächst einmal mußt du eine CallBack TimerFunktion definieren.
VOID CALLBACK TimerProc (HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime) { // Hier kommt deine Ausgabefunktion der Uhrzeit rein. }Im Windows-Message-Loop mußt du dies einbauen:
case WM_TIMER: return 0;Und den Interwall des Timers setzt du mit: (200 ist die Zeit in Millisekunden)
SetTimer(hwnd,ID_TIMER,200,TimerProc);Das Ganze mußt du dann nurnoch formgerecht einbauen.
-
Vielen Dank...das werde ich dann jetzt mal versuchen;-)
-
Sooo...jetzt doch noch ein paar Fragen zur Umsetzung^^:
1. Die Zeile:
SetTimer(hwnd,ID_TIMER,200,TimerProc);muss an welche Stelle gesetzt werden? In die Timer-Callback?
2. String <-> Zahl
Ich würde zunächst gerne einmal die Sekunden in einem Label ausgeben. Das Ganze wollte ich so machen:
wsprintf(hText,TEXT("%i"),sekunde); SetWindowText (hText, sekunde);Sekunde ist vom Typ Integer. Der Compiler erwartet aber einen String. Wie wandle ich das um?
-
1. SetTimer kann sehr gut bei der Initialisierung des Fensters, also bei WM_CREATE, stehen. Eine TimerProc ist optional, es kann auch NULL übergeben werden. Für deinen Fall reicht es vielleicht aus, auf die Nachricht WM_TIMER zu reagieren. SetTimer in der TimerProc würde natürlich keinen Sinn machen.
Am Anfang von Seite 3 hast du geschrieben, dass du das Projekt auf Multiibyte umgestellt hast. Außerdem macht es keinen Sinn, Funktionen für WChars mit Funktionen und Makros für TCHARs zu mischen. Also am Besten TCHAR-Funktionen wie _tprintf verwenden. Alternativ ginge natürlich auch _itot.
Edit : Für Integer nimm am Besten %d, also
_tprintf(hText, TEXT("%d"), sekunde);Edit2 : Schau dir einmal die sichereren Funktionen wie
StringCbPrintfaus <strsafe.h> an.
-
Muss ich für den Befehl _tprintf eine weitere header-Datei einbinden?
Ich erhalte immer den Fehler "Bezeichner nicht gefunden"
-
Ich habe mich gerade selber vertan, sorry. Includier' am Besten <strsafe.h> und nutze StringCbPrintf. Oder eben die Funktionen, die dafür gedacht sind wie itoa bzw. _itot.
Funktionen im Umgang mit TCHARs sind in <tchar.h> deklariert.
Das TCHAR-Pendant zu sprintf heißt _stprintf, nicht wie von mir fälschlicherweise geschrieben _tprintf.