2009-09-17 13 views

Antwort

7

Schauen Sie sich SetTimer Funktion an.

UINT_PTR timerid = SetTimer(NULL, 0, milliseconds, &callback); 
+0

... Wenn es eine windowed Win32 C-Anwendung ist. – Kieveli

+4

Ja, es muss eine Nachrichtenschleife haben. Es muss jedoch keine Fenster haben. – avakar

+0

@avakar Wenn also ein Ereignis eintritt, muss ich den Timer zurücksetzen. Wie kann ich das erreichen? – Sorcrer

0

Timer sind nicht Teil der C-Sprache.

Sie sollten die Dokumentation für die Programmierumgebung, die Sie verwenden, nachschlagen, um herauszufinden, wie Sie Timer ausführen. Da Sie nicht angegeben haben, welche Umgebung, ist es nicht möglich, Ihre Frage zu beantworten.

+1

Die Plattform ist Windows. – Vidya

0

Wenn Sie bereit sind WIN32 zu bekämpfen Thread Pools, können Sie Thread-Pool-Timer verwenden.

Ein Threadpool ist eine Sammlung von Worker-Threads, die asynchrone Callbacks im Auftrag der Anwendung effizient ausführen. Der Thread-Pool wird hauptsächlich verwendet, um die Anzahl der Anwendungsthreads zu reduzieren und die Verwaltung der Arbeitsthreads bereitzustellen. Anwendungen können Arbeitsaufgaben in Warteschlangen stellen, Arbeitsaufgaben mit Waitable-Handles verknüpfen, basierend auf einem Zeitgeber automatisch in die Warteschlange aufnehmen und mit I/O verbinden.

Ein Teil dieser API finden

CreateTimerQueueTimer Function

eine timer-Warteschlangen-Zeitgeber verursacht. Dieser Timer läuft zum angegebenen Zeitpunkt und dann nach jeder angegebenen Zeit ab. Wenn der Timer abläuft, wird die Callback-Funktion aufgerufen.

0

Wenn Sie in Ihrer Anwendung nichts anderes tun müssen, können Sie die Funktion sleep() verwenden. Die Ausführung wird nicht fortgesetzt, und die Ausführung des Codes wird fortgesetzt, nachdem die angegebene Dauer abgelaufen ist (ish).

In Windows verwendeten wir eine Multimedia-Timer-Funktion, wenn Sie für weniger als eine Sekunde Pause schlafen wollten. Einige andere Methoden sind plattformabhängig.

Ich habe auch von Leuten gehört, die 'select()' als Methode zum Schlafen für Milli/Mikrosekunden verwenden.

Wenn Sie andere Dinge benötigen, die Sie verwenden möchten, verwenden Sie den Befehl sleep/select innerhalb eines zweiten Threads.

Hier ist auch eine Google Library for doing high resolution timing. Es könnte helfen.

+0

+1, weil mir die Google-Referenz gefallen hat. –

0

Eine Möglichkeit besteht darin, SetTimer aufzurufen und dann das WM_TIMER-Ereignis in Ihrem WndProc zu behandeln.Zum Beispiel würde dieser Aufbau ein Timer, der alle 45 Sekunden und zeigt eine Meldung, wenn es heißt genannt wird:

 
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch(message) 
    { 
     case WM_CREATE: 
      SetTimer(hwnd, 1, 45000, NULL); 
      break; 

     case WM_TIMER: 
      MessageBox(hwnd, L"Timer", L"Timer fired!", MB_OK); 
      break; 
    } 
    return DefWindowProc(hwnd, message, wParam, lParam); 
} 

Der erste Parameter für SetTimer ist das Fenster, das Sie die WM_TIMER-Nachricht empfangen möchten - Sie wahrscheinlich Willst du, dass dies dein Fenster ist, so kannst du einfach an dem Fenster vorbei gehen, an dem dich Fenster passiert haben.

Der zweite Parameter ist eine Zahl, mit der Sie den Timer eindeutig identifizieren können. Sie könnten mehr als einen Timer gleichzeitig laufen lassen und müssten einen Weg finden, um festzustellen, welcher ausgelöst wurde.

Der dritte Parameter gibt an, wie lange der Timer warten soll, bevor er ausgelöst wird. Es ist in Millisekunden, also müssen Sie mehrere tausend, wenn Sie Sekunden wollen.

Der vierte Parameter ist NULL, wenn Sie Timer mit WM_TIMER behandeln möchten. Andernfalls können Sie einen Zeiger auf eine Callback-Funktion übergeben, die stattdessen aufgerufen wird.

Denken Sie daran, der Timer wird alle X Millisekunden weiterfeuern, bis Sie ihn beenden. Sie können es töten, indem Sie KillTimer aufrufen und die gleiche Zahl übergeben, die Sie beim Aufruf von SetTimer an den zweiten Parameter übergeben haben.

Wenn Windows Ihnen die WM_TIMER-Nachricht sendet, enthält das WParam außerdem die Zeitgeberkennung, die Sie in dem zweiten Parameter übergaben, wenn Sie SetTimer angaben.

+0

Sie brauchen kein Fenster, Sie brauchen nur eine Nachrichtenschleife –

0

Wahrscheinlich ein bisschen vom Ziel entfernt, und es ist C++ nicht gerade C, aber hier ist meine Implementierung einer Timer-Warteschlange für Windows mit Tests und einem Kommentar zu TDD. Beachten Sie, dass der erste Teil in der Reihe erklärt, warum ich mich entschied, meine eigenen zu rollen, anstatt die Alternativen zu verwenden.

http://www.lenholgate.com/blog/2004/05/practical-testing.html

1

Von Timers and default actions:

/* ** TIMEGETC.C - waits for a given number of seconds for the user to press ** a key.  Returns the key pressed, or EOF if time expires ** ** by Bob Jarvis */ 

#include <stdio.h> 
#include <time.h> 
#include <conio.h> 

int timed_getch(int n_seconds) 
{ 
    time_t start, now; 

    start = time(NULL); now = start; 

    while(difftime(now, start) < (double)n_seconds && !kbhit()) { now = time(NULL); } 

    if(kbhit()) 
     return getch(); 
    else 
     return EOF; 
} 

void main(void) 
{ 
    int c; 

    printf("Starting a 5 second delay...\n"); 

    c = timed_getch(5); 

    if(c == EOF) 
     printf("Timer expired\n"); 
    else 
     printf("Key was pressed, c = '%c'\n", c); 
} 

Aber ich würde betrachten die Verwendung von Fenster :: SetTimer(), wie oben erwähnt ...

Verwandte Themen