一个50ms的轮询,按键按下计数加1,但由于读取的按键按下的时间过长会持续计数加1,写一段c程序让按键按下只计数增加一次
时间: 2024-10-15 22:27:17 浏览: 29
在C语言中,要解决这个问题,通常会利用硬件中断或者键盘扫描函数,配合适当的时间窗口来避免误计。下面是一个简化的示例,使用了Windows API中的GetAsyncKeyState函数来检测按键状态,并且每50毫秒检查一次。我们将使用全局变量来存储按键状态变化次数,并且设置一个锁来确保计数的安全性。
```c
#include <windows.h>
#include <stdio.h>
unsigned int keyPressCount = 0;
CRITICAL_SECTION cs;
void CALLBACK keyboardCallback(int nCode, WPARAM wParam, LPARAM lParam) {
if (wParam == WM_KEYDOWN && IsThreadAFiber()) {
EnterCriticalSection(&cs);
++keyPressCount;
LeaveCriticalSection(&cs);
}
}
int main() {
InitializeCriticalSection(&cs);
SetConsoleCtrlHandler(keyboardCallback, TRUE); // 注册键盘回调
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
if (msg.message == WM_KEYDOWN) { // 检查是否有新的按键按下
Sleep(50); // 等待50ms
}
}
DeleteCriticalSection(&cs);
return 0;
}
```
在这个例子中,我们使用了一个全局临界区(CRITICAL_SECTION)来保护关键数据。当按键被按下并且当前线程正在运行时,才允许计数加1。这样可以确保按键按下时,计数只会增加一次,即使按键保持按下状态超过50毫秒。
阅读全文