在概要形式中,您的代码将包含 2 个线程。在辅助线程中运行,iOS tone initiator。在主线程中,有一个经过的计时器、一个包含键陷阱的 while 循环和一个转义条件,当条件满足时可以退出循环。
一些伪代码:(使用一些 Windows 函数进行概念说明)
int gRunning = 1;
//Initiate tone in a secondary thread
//initialize elapsed time keeper to start
while(gRunning)
{
//Call key trap function here
//if Key Hit, set gRunning == 0;
}
//Get elapsed time here
//Kill tone and secondary thread
int KeyTrap(void)
{
//Write code here using GetAsyncKeyState() to check hits on relevant keys
return "any key hit"
}
在实际实现中可以使用以下函数:
short GetAsyncKeyState(int);
和
time_t clock()
GetAsyncKeyState() 通常用于控制台应用程序,以允许监视或响应用户击键。如果函数成功,则返回值指定自上次调用 GetAsyncKeyState 以来是否按下了键,以及该键当前是向上还是向下。如果设置了最高有效位,则按键按下,如果设置了最低有效位,则在上一次调用 GetAsyncKeyState 后按键被按下。但是,您不应该依赖最后一种行为;有关详细信息,请参阅备注。
例如,要捕获“k”或“K”键被击中的时间,(您可以将一系列这些编码到“keyHandler”函数中以获取多个键),然后在 while 循环中调用:
state = GetAsyncKeyState('k');
state1 = GetAsyncKeyState('K');
if ((0x80000000 & state) ||
(0x80000000 & state1))
{
//do something here
}
clock() 返回自程序开始执行以来发生的系统时钟周期数。时钟滴答数可以包括其他进程使用的时间。要将时钟周期数转换为秒,请除以 CLOCKS_PER_SEC 以获得最接近毫秒的近似值。
注意 我的环境中的 time.h 定义 CLOCKS_PER_SEC 如下:
#if defined(_NI_unix_) || defined(_NI_sparc_)
#define CLOCKS_PER_SEC 1000000
#elif defined(_NI_mswin16_) || defined(_NI_mswin32_) || defined(_NI_mswin64_)
#define CLOCKS_PER_SEC 1000
#elif defined(_NI_mac_)
#define CLOCKS_PER_SEC 1
因此,对于 Mac,使用clock() 时,您的最佳分辨率似乎是 1 秒
另一个选项,这个提供毫秒分辨率:
GetLocalTime()
例如:
SYSTEMTIME s;
GetLocalTime(&s);
swprintf_s(buff, L"[%02d:%02d:%02d:%d]\t", s.wHour, s.wMinute, s.wSecond, s.wMilliseconds);
定义SYSTEMTIME的地方:
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;