我正在尝试在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秒开始两次单独调用。
非常感谢任何帮助。
答案 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;
}