【问题标题】:OSx Keyboard presses COSx 键盘按 C
【发布时间】:2014-04-14 14:56:56
【问题描述】:

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

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

我正在使用 OSx 和 C。

【问题讨论】:

  • 你有一些可以发布的代码的开始吗?即你尝试了什么?
  • 我已经尝试过 getchar() 和一些 scanf 函数,还查看了 linux 的 curses,但我似乎无法弄清楚这些在 osx 上是如何工作的。
  • 对于 GetAsyncKeyState 的 linux 变体,请查看 fgetc_unlocked,与 getc() 基本相同,只是它不会阻塞。此外,它适用于控制台程序(即使用 stdio)。 jQuery 也可能会为您提供一些答案。另请参阅我对线程的回答的编辑(接近顶部)

标签: c input


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-08-11
    • 1970-01-01
    • 2013-11-22
    • 2015-01-28
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    相关资源
    最近更新 更多