Hilfe bei "Stopuhr-Projekt"



  • Hallo zusammen,

    folgende Problemstellung:

    Ich brauche für eine wissenschafltiche Anwendung eine Software-Stopuhr. Nun gibt es im Internet Massen an Stopuhren zum runterladen. Leider erfüllen diese nicht meine Anforderungen. Die Stopuhr soll keine Uhr sein, die von 0 losläuft, sondern sie soll die Uhrzeit stoppen. Die gestoppten Uhrzeiten sollen dann in einer Art Tabelle angezeigt werden. Die Uhrzeit sollte auf tausendstel Sekunden genau sein. Das Stoppen an sich, soll bei jedem Mausklick erfolgen und zwar bei wirklich jedem, egal ob im Programm oder auf dem Desktop oder sonst wo, bei wirklich jedem Mausklick, dabei soll es auch keine Rolle spielen, ob das Programm im Hintergrund ist oder minimiert ist. Die Uhrzeit sollte sich am besten mit einem Zeitserver syncronisieren lassen, aber die Systemzeit würde es für den Anfang auch tun. Hauptsache man hat die tausendstel Sekunde (noch genauer wäre natürlich noch besser).

    Also nochmal zusammengefasst: Beim Starten des Programmes, soll es mir die Uhrzeit auf eine tausendstel Sekunde genau anzeigen. Bei jedem Mausklick soll die in dme Moment aktuelle Uhrzeit in eine Tabelle geschrieben werden (nummeriert von 1-...). Schön wäre es auch, wenn er die gestoppten Uhrzeiten auch gleich in eine Text-Datei schreibt. Die "Mausklick-Funktion" muss auch deaktivierbar sein, denn es wäre ja nervig, wenn er nach meiner Messung immer weiter die Zeiten stoppt.

    So, warum schreibe ich das? Nun, ich habe nur Grundlagenwissen in der Windowsprogrammierung und bräuchte einfach von Grund auf Hilfe. Ich habe es auch schon mit Windows Forms versucht, aber davon habe ich gleich null Ahnung.

    Was kann ich? Ich kann ein Windowsfenster programmieren. Darin kann ich Text mit "TextOut" anzeigen lassen, ich kann ein bisschen mit der GDI (Rechtecke, Kreise...etc.) rumspielen. Ich weiß ungefähr wie man Nachrichten behandelt. Also ich weiß durchaus wo man den Quellcode reinschreibt, der ausgeführt werden soll wenn man die linke Maustaste drückt. Da hört es jetzt auch schon langsam auf.

    Was ich nicht kann? Ich weiß nicht, wie man auf die Systemzeit zugreift. Ich weiß nicht wie ich sie dann anzeigen lassen kann...das dürfte mit "TextOut" dann schonmal nicht mehr funktionieren oder? Ich weiß nicht wie man irgendwas übers Internet syncroniesiert (ist nur optional)? Ich weiß nicht wie man irgendwas in eine Datei speichert...etc.

    Also, ihr seht schon, ich habe wenig Ahnung und viele Fragen. Ich würde mich freuen, wenn sich mir einer annehmen könnte, den ich ein bisschen löchern kann^^

    Ich bin für alle Tipps und Anregungen unendlich dankbar, da die ganze Sache recht bald funktionieren müsste. Wie das Ganze dann grafisch aussieht ist übrigens egal.

    Ich danke euch und wünsche euch einen schönen Advent...

    ciao Peter



  • Also ich habe jetzt herausgefunden, dass die Funktion "QueryPerformanceCounter" wohl das Beste für meine Anforderung ist. Leider kann ich mit dem Programmierer-chinesisch nicht viel anfangen:-(



  • Wenn du nix kommen klar mit der Chinesisch von das Chinamann, mußtu lernen sein Sprache, dann verstehen du sein chinessich sprech..

    Mal im Ernst.. Du möchtest etwas programmieren, aber verstehst die Sprache nicht?

    Gruß,
    DC



  • Na sagen wir...ich kann die Grundlagen. Aber für mein Problem bräuchte ich halt ein bisschen mehr. Darum frage ich ja auch hier...wenn ich das alles wüsste und die Sprache "perfekt" könnte, dann bräuchte ich auch dieses Forum nicht;-)

    Ich habe jetzt schonmal was zusammenbasteln können:

    #include <windows.h>
    #include <iostream>
    
    int main()
    {
        //Variablen
        LONGLONG g_Frequency, g_CurentCount, g_LastCount;
    
        //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::cin.get();
    
    	return 0;
    }
    

    Somit kann ich die Zeit auf einige hundert Nanosekunden genau bestimmen. Problem es handelt sich hierbei noch nicht um eine Uhrzeit.

    Was ich mir jetzt vorstelle ist folgendes: Man nutzt einfach die Systemzeit als Ausgangszeit und rechnet dann manuell mit den obigen Befehlen weiter. Beispiel: Zum Programmstart ist es genau 18 Uhr...nun wird einfach die seit dem Start vergangene Zeit hinzu addiert und als Uhrzeit ausgegeben. Ist das realisierbar? Wie bekomme ich die Systemzeit?



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


Anmelden zum Antworten