Hilfe bei "Stopuhr-Projekt"



  • SYSTEMTIME st; 
    TCHAR      sz[128]; 
    
    GetLocalTime(&st); 
    GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, NULL, sz, (sizeof(sz) / sizeof(sz[0]))); 
    
    cout << sz << "\n";
    

    Ich hoffe, du weißt, wo du was einbaust.

    Gruß,
    DC



  • Und für die zeit in Millisekunden zu messen würde ich dies machen:

    clock_t zeit1 , zeit2;
    
    zeit1 = clock();
    
    // tue irgendwas...
    
    zeit2 = clock();
    
    cout << "Vergangene Zeit in Millisekunden: " << (zeit2-zeit1) << "\n";
    

    Gruß,
    DC



  • OK...ich habe das jetzt mal so eingebaut. Er gibt mir dann für sz eine Hexadezimalzahl aus z.B.: 1BFA78...in Dezimalzahlen wäre das: 1833592 --> Das ergibt natürlich keinen Sinn. Meine zweite Vermutung ist, da es sich hierbei ja um ein Feld und damit auch um einen Zeiger handelt, es eine Speicheradresse ist. Da sich die Hexadezimalzahl bei jedem Aufruf ändert würde das ja passen. Benutze ich nun den Dereferenzierungsoperator kommt aber immer 49 raus, was auch keinen Sinn ergibt. Wo mache ich einen Fehler?

    #include <windows.h>
    #include <iostream>
    #include <time.h> 
    
    int main()
    {
        //Variablen
        LONGLONG g_Frequency, g_CurentCount, g_LastCount;
    	SYSTEMTIME st;
    	TCHAR      sz[128]; 
    
    	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;
    	std::cout << *sz << "\n"; 
    
    	std::cin.get();
    
    	return 0;
    }
    

    Danke...



  • Warum gibst du *sz aus?
    cout << sz << "\n";

    So hatte ich es gepostet.

    Gruß,
    DC



  • Seltsam, bei mir gibt dein Code (ohne *sz) das richtige Zeitformat aus.



  • Ja, wenn ich den Stern weglasse kommt eine Hexadezimalzahl raus...



  • Wenn du sowas machst bei der Definition:

    TCHAR      sz[128]={0};
    


  • Hat leider nicht geholfen...



  • 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
    05

    Dann 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?


Anmelden zum Antworten