gpt4 book ai didi

c - OSx 键盘按 C

转载 作者:行者123 更新时间:2023-11-30 17:35:10 31 4
gpt4 key购买 nike

我正在编写一个实验设计,我需要能够播放来自多个扬声器/ channel 的声音,然后让用户在认为声音来自某个扬声器/ channel 时按下相应的键。 (即:参与者认为声音来自扬声器 4,因此按下键 4)。我希望能够记录正在播放的声音和用户按下按键所需的时间之间花费的时间。

当我从同一个应用程序播放声音时,我真的不想通过不断等待用户输入来锁定应用程序。我猜我可以将用户输入扔到另一个线程上,但是实现此目的的最佳方法是什么?我显然不希望用户在每次按键后都必须按 Enter。

我使用的是 OSx 和 C。

最佳答案

以概要形式,您的代码将包含 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;

关于c - OSx 键盘按 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23063402/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com