非阻塞定时器C ++

时间:2012-08-03 23:53:19

标签: c++ timer nonblocking

我正在尝试在C ++中创建一个可以重置的简单非阻塞计时器。我已经谷歌搜索了一段时间来找到一些代码示例,但我发现的一切都太复杂,无法理解或没有额外的非示例代码编译。

我有一个程序可以将按键记录到文件中,但我希望在按下按键后一秒钟内写入该文件,除非在第二个按键启动之前按下了另一个按键。

我相信我应该使用Win32计时器,(我正在使用Windows)但是我找不到一个简单的可编辑的例子。

例如这个方法取自信息页面:

SetTimer(hwnd,                // handle to main window 
IDT_TIMER1,                   // timer identifier 
1000,                        // 1-second interval 
(TIMERPROC) MyTimerProc);     // no timer callback 


VOID CALLBACK MyTimerProc( 
HWND hwnd,        // handle to window for timer messages 
UINT message,     // WM_TIMER message 
UINT idTimer,     // timer identifier 
DWORD dwTime)     // current system time 
{

// my proceedure code 

FILE *OUTPUT_FILE;
OUTPUT_FILE = fopen("LOG.TXT", "w");
fprintf(OUTPUT_FILE, "%s", "");
fclose(OUTPUT_FILE);

// writes a blank text file.


KillTimer(hwnd, IDT_TIMER1); // stop timer after one call
}

无法编译,因为我认为IDT_TIMER1尚未定义。

此外,我不确定这是否可以通过调用两次来重置,或者只是相隔1秒开始两次单独调用。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:0)

您有责任给ID_TIMER1一个值。我相信你(99%)也必须有一个Windows消息循环才能工作。

以下是一些最小的,可编辑的examples

答案 1 :(得分:0)

只需使用硬件性能计时器,可以通过谷歌快速找到,或者如果你想要更多的跨平台使用timegettime方法,也可以通过谷歌找到,也不需要Win32消息循环。

答案 2 :(得分:0)

您不需要窗口甚至是事件循环。查看WaitForSingleObject function

这是一些代码

HANDLE hStdin; 
hStdin = GetStdHandle(STD_INPUT_HANDLE); 

FILE *OUTPUT_FILE;
OUTPUT_FILE = fopen("LOG.TXT", "w");

bool previous_input_written = TRUE;

switch (WaitForSingleObject(hStdin, 1000) {

  case WAIT_OBJECT_0:  
    // input happened on hStdin 
    if (!previous_input_written) {
      // the previous input was not saved to file
      fprintf(OUTPUT_FILE, ...
      previous_input_written= TRUE;
    }
    ReadConsoleInput(hStdin, ...
    previous_input_written = FALSE;

  case WAIT_TIMEOUT: 
    // the 1000ms delay timed out, write to file
    fprintf(OUTPUT_FILE, ...
    previous_input_written= TRUE;
}


fclose(OUTPUT_FILE);

答案 3 :(得分:0)

以下控制台程序有效。它使用SetTimer设置计时器 然后在消息循环中循环。消息循环接收并处理WM_TIMER条消息 并且还为每个时间间隔调用计时器回调。并且它不会阻止。

#define STRICT 1 
#include <windows.h>
#include <iostream.h>

VOID CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime) 
{
  cout << "Time: " << dwTime << '\n';
  cout.flush();
}

int main(int argc, char *argv[], char *envp[]) 
{
    int Counter=0;
    MSG Msg;

    UINT TimerId = SetTimer(NULL, 0, 500, &TimerProc); //SetTimer

    cout << "TimerId: " << TimerId << '\n';
   if (!TimerId)
    return 16;

   while (GetMessage(&Msg, NULL, 0, 0)) 
   {
        ++Counter;
        if (Msg.message == WM_TIMER)
        cout << "Counter: " << Counter << "; timer message\n";
        else
        cout << "Counter: " << Counter << "; message: " << Msg.message << '\n';
        DispatchMessage(&Msg);
    }

   KillTimer(NULL, TimerId);
return 0;
}