Timer abfragen



  • Hallo,
    Ich setze Timer1->Interval = 5000.
    Ich Enable Timer1, warte auf ein Ereigniss und Disable den Timer.
    Gibt es nun eine Möglichkeit festzustellen, wieviel ms der Timer
    gelaufen ist?



  • Du meinst die Länge der Routine in der OnTimer-Behandlung? Das kannst du so machen:

    DWORD tc = GetTickCount();
    // Deine Routine
    tc = GetTickCount() - tc;
    

    Dann steht in tc die Länge der Routine. Aber wozu brauchst du das?



  • Das meine ich nicht.

    Ich möchte einfach nur die Dauer eines bestimmten Vorganges in ms messen.

    Ich habe ein Programm geschrieben welches unter Windows das anpingen einer
    IP ermöglicht.

    Bisher mache ich es so, wenn kein Echo der angepingten IP erfolgte erhöhe
    ich den Timeout Wert in Schritten (10ms,100ms,200ms,300ms,400ms,500ms) ich
    fange mit 1ms an.
    Wird bei dem Wert 500ms kein Echo empfangen, gebe ich TIMEOUT aus, ansonsten
    gebe ich z.B. TIME <= 200ms aus.

    Ich möchte nun folgendes, ich setze den Timeoutwert konstant auf 1000ms
    starte einen timer pinge die IP an ist nun der Timeout gekommen
    gebe ich TIMEOUT aus, ansonsten stoppe ich den Timer lese den Wert wie
    lange der Timer gelaufen ist und gebe diesen Wert aus z.B TIME = 183ms.

    Gibt es eine Möglichkeit so etwas zu machen?
    Gruß
    Johann



  • wie wärs, wenn du in den timer einfach eine zählvarible einbaust und die dann abfragst?



  • Dur brauchst entweder einen zweiten Timer mit kurzer Taktrate, mit dem du eine Zählvariable inkrementierst, oder du musst eine normale Zeitmessung wie die von WebFritzi parallel mitlaufen lassen. Letzteres dürfte insbesondere bei Messungen im Millisekundenbereich die deutlich bessere Lösung sein.

    Aus dem Timer selbst kannst du die verstrichene Zeit jedenfalls nicht auslesen.



  • Das mit der variable erhöhen habe ich schon probiert, leider wird das Ereigniss
    OnTimer während ich mich in der Ping Funktion befinde nicht ausgeführt(habe
    einen breakpoint gesetzt).

    Auf dem Mainboard befindet sich doch ein 16 Bit Timerbaustein 8253, auf die Register des Bausteins konnte ich in Assembler unter DOS ohne Probleme zugreifen.

    Gibt es nicht eine Möglichkeit unter Windows auf diesen Baustein zuzugreifen?

    Gruß
    Johann



  • Habe jetzt nochmal versucht, deinen zweiten Beitrag zu verstehen.
    Wozu die stufenweise Erhöhung des Timeout-Wertes? Setz ihn gleich auf das gewünschte Maximum und miss einfach die Zeit, die die Ping-Funktion benötigt.

    int timeout = 500;
    DWORD tc = GetTickCount();
    DeinPing(IP, timeout);
    tc = GetTickCount() - tc;
    ShowMessage("Dauer: " + String(tc) + " ms);
    

    Sinnvoller wäre es allerdings, wenn du die Zeitmessung innerhalb deine Ping-Funktion vornimmst und dann das entsprechende Ergebnis zurückgibst.
    Halt so, wie es die Ping-Programme der Betriebssysteme auch machen.

    Oder du benutzt gleich eine ICMP-Komponente wie die aus dem Indy-Paket, die nimmt dir sowas ab.



  • Also die liest in die Variable tc den Rückgabewert von GetTickCount();
    Nach dem Ping das ganze nochmal und subtrahierst das ganze, ist schon klar.

    ich verstehe das mit dem GetTickCount() nicht ganz, ist das eine Funktion
    mit der was ausgelesen wird und wozu tc als DWORD (32 Bit) und nicht int,
    gebe zu das ich schon öfters auf DWORD gestossen bin, kenne das aber
    nur in der Assemblersrache (test DWORD FFFFFFFFh;)

    Außerdem kommt die Fehlermeldung "Ambiguity between _fastcall idglobal::
    GetTickCount() and __stdcall GetTickCount()"



  • hermes schrieb:

    ich verstehe das mit dem GetTickCount() nicht ganz, ist das eine Funktion, mit der was ausgelesen wird und wozu tc als DWORD (32 Bit) und nicht int, gebe zu das ich schon öfters auf DWORD gestossen bin, kenne das aber
    nur in der Assemblersrache (test DWORD FFFFFFFFh;)

    DWORD ist ein Windows-Typ und ist AFAIK nichts anderes als ein unsigned int.

    hermes schrieb:

    Außerdem kommt die Fehlermeldung "Ambiguity between _fastcall idglobal::GetTickCount() and __stdcall GetTickCount()"

    Dann schreib ::GetTickCount();



  • hermes schrieb:

    ich verstehe das mit dem GetTickCount() nicht ganz [...]

    Cursor auf GetTickCount, F1 drücken.

    [...] wozu tc als DWORD (32 Bit) und nicht int [...]

    Rechtsklick auf DWORD, "Deklaration finden".



  • hermes schrieb:

    wozu tc als DWORD (32 Bit) und nicht int

    Weil GetTickCount() einen DWORD zurückgibt. Ganz einfach.


Anmelden zum Antworten