Hilfe für Timer



  • Hallo,

    habe bereits im C/C++ Forum :: VCL/CLX (Borland C++ Builder) diese Frage gestellt, und wurde hier verwiesen.

    Suche eine Komponente / Routine , die einen Timer mit 1 ms darstellt, welche wiederholt gestartet wird.

    vielen Dank im voraus.

    Gruß Siegfried



  • Vorbemerkung: Windows ist kein Echtzeit Betriebssystem!
    Du kannst die Multimedia-Timer versuchen...
    http://msdn.microsoft.com/library/en-us/multimed/htm/_win32_multimedia_timers.asp



  • class SekundenZaehler
    {
        private:
            __int64 Frequency;
            __int64 StartCount;
            __int64 PerformanceCount;
        public:
            SekundenZaehler()
            {
                QueryPerformanceFrequency((LARGE_INTEGER*)&Frequency);
                Reset();
            }
            void Reset()
            {
                QueryPerformanceCounter((LARGE_INTEGER*)&StartCount);
            }
            float Get()
            {
                QueryPerformanceCounter((LARGE_INTEGER*)&PerformanceCount);
                return (PerformanceCount - StartCount) / (float)Frequency;
            }
    };
    


  • Wenn du mit VC++ 6.0 arbeitest könntest du dies mit der OnTimer Funktion lösen (so mach ich das halt immer) und dann einen timer mit SetTimer(int id, int 1 /*zeit = 1ms */, null) erstellen.
    Die OnTimer Funktion kannst du wenn du STRG + W drückst einfach hinzufügen.



  • Hallo,

    muß noch alle Infos verarbeiten. Weiß noch nicht, wie ich dies umsetze. Verstehe trotzdem nicht, weshalb ich keinen Interval von 1 ms bei einem Timer hinbekomme.

    Gruß Siegfried



  • Beppo schrieb:

    Verstehe trotzdem nicht, weshalb ich keinen Interval von 1 ms bei einem Timer hinbekomme.

    Mit SetTime bekommst Du es nicht hin, weil Windows kein Echtzeitbetriebssystem ist und es deshalb eine Auflösung von 10-20 ms hat.
    Du kannst Dir wie gesagt höchstens die Multimedia-Timer anschauen...



  • Beppo schrieb:

    Hallo,

    muß noch alle Infos verarbeiten. Weiß noch nicht, wie ich dies umsetze. Verstehe trotzdem nicht, weshalb ich keinen Interval von 1 ms bei einem Timer hinbekomme.

    Gruß Siegfried

    Du initialisiert die Klasse dich ich gepostet habe und die get funktion sagt dir dann wieviel sekunden seit der initialisierung vergangen sind. mit reset() kannst du die zeit wieder auf 0 s setzen.

    Wofür brauchst du es eigentlich`??

    mfg.



  • Hallo joomoo,

    in einer Schleife möchte ich eine IO-Karte abfragen. Dazu habe ich die Komponente "Timer" von C++ eingesetzt. Leider mußte ich feststellen, das kleinere Zeitwerte von 20 ms ignoriert werden. Somit hätte ich ein Zyklus von ca 50-60 pro Sekunde. Dies ist mir zu wenig. Die Klasse die du gepostet hast kenne ich, zwar in einer anderen Art. Korrigiere mich bitte, wenn ich falsch denke. Die Klasse ist doch nur für eine Zeit Differenz Messung zwischen Start und End? Deshalb ist für mich unklar, wie ich diese einsetzen kann, für den Aufruf der Abfrage für die IO-Karte in meiner Routine, und dann nach Ablauf der Zeit X erneut meine Abfrage starte.

    Gruß Siegfried



  • Beppo schrieb:

    Hallo joomoo,

    in einer Schleife möchte ich eine IO-Karte abfragen. Dazu habe ich die Komponente "Timer" von C++ eingesetzt. Leider mußte ich feststellen, das kleinere Zeitwerte von 20 ms ignoriert werden. Somit hätte ich ein Zyklus von ca 50-60 pro Sekunde. Dies ist mir zu wenig. Die Klasse die du gepostet hast kenne ich, zwar in einer anderen Art. Korrigiere mich bitte, wenn ich falsch denke. Die Klasse ist doch nur für eine Zeit Differenz Messung zwischen Start und End? Deshalb ist für mich unklar, wie ich diese einsetzen kann, für den Aufruf der Abfrage für die IO-Karte in meiner Routine, und dann nach Ablauf der Zeit X erneut meine Abfrage starte.

    Gruß Siegfried

    Ich hatte mir das so vorgestellt: (pseudo code)

    SekundenZaehler sz;
    float sz_temp;
    while(!done)
    {
    while(sz_temp < sz.Get())
    {
    sz_temp += 0.001f; // für eine ms
    Bla();
    }
    }
    

    Die Bla() Funktion würde dann jede ms aufgerufen.

    mfg.
    [/cpp]



  • Hallo,

    Werde dies ausprobieren, Danke.

    Gruß Siegfried



  • joomoo schrieb:

    Die Bla() Funktion würde dann jede ms aufgerufen.

    Das ist aber nur Theorie...
    Ich muss es nochmals sagen: Windows ist kein Echtzeitbetriebssystem!

    Nehmen wir mal an Du machst noch was anderes auf diesem Rechner. Zum Beispiel nur ein Thread der auch was für einige Sekunden tun will. Jetzt nehmen wir noch an, die Threads hätten noch die gleiche Priorität. Und schon hast Du den Salat. Dein "I/O-Thread" kommt jetzt nur alle 45 ms dran.
    Wenn Du es ganz genau wissen willst, warum das so ist, dann Beschäftige DIch mal mit OS Architektur / Quantums und Scheduling.
    Ich empfehle Dir dazu ganz dringend: Microsoft Windows Internals, 4th Edition
    http://www.microsoft.com/MSPress/books/6710.asp



  • Jochen Kalmbach schrieb:

    joomoo schrieb:

    Die Bla() Funktion würde dann jede ms aufgerufen.

    Das ist aber nur Theorie...
    Ich muss es nochmals sagen: Windows ist kein Echtzeitbetriebssystem!

    Nehmen wir mal an Du machst noch was anderes auf diesem Rechner. Zum Beispiel nur ein Thread der auch was für einige Sekunden tun will. Jetzt nehmen wir noch an, die Threads hätten noch die gleiche Priorität. Und schon hast Du den Salat. Dein "I/O-Thread" kommt jetzt nur alle 45 ms dran.
    Wenn Du es ganz genau wissen willst, warum das so ist, dann Beschäftige DIch mal mit OS Architektur / Quantums und Scheduling.
    Ich empfehle Dir dazu ganz dringend: Microsoft Windows Internals, 4th Edition
    http://www.microsoft.com/MSPress/books/6710.asp

    Ja weiß ich doch, deswegen wollte ich ja auch wissen wofür er das braucht.
    Bei einem kleinem Spiel z.B. ist sowas nicht so wichtig.

    mfg.


Anmelden zum Antworten