首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OSx键盘按C

OSx键盘按C
EN

Stack Overflow用户
提问于 2014-04-14 14:56:56
回答 1查看 108关注 0票数 0

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

因为我在播放来自同一个应用程序的声音,所以我并不想通过不断地等待用户输入来锁定应用程序。我猜我可以把用户输入放到另一个线程上,但是实现这个目标的最好方法是什么呢?显然,我不希望用户不得不按下每个键后的回车键。

我用的是OSx和C。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-14 15:37:19

格式为,您的代码将包含2个线程。在辅助线程( http://www.cocoawithlove.com/2010/10/ios-tone-generator-introduction-to.html )中运行。在主线程中,经过的计时器、包含密钥陷阱的while循环和转义条件,在满足条件时可以退出循环。

一些伪代码:(使用一些Windows函数进行概念说明)

代码语言:javascript
复制
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"
}

可在实际执行中使用下列功能:

代码语言:javascript
复制
short GetAsyncKeyState(int);  

代码语言:javascript
复制
time_t clock()  

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646293%28v=vs.85%29.aspx通常用于控制台应用程序,以允许监视,或响应用户的键笔画。如果函数成功,则返回值指定自上次调用GetAsyncKeyState以来按下键,以及键当前是向上还是向下。如果设置了最重要的位,则键被关闭,如果设置了最小的位,则在上一次调用GetAsyncKeyState之后按下键。但是,您不应该依赖于最后一个行为;有关更多信息,请参见备注。

例如,要捕获'k‘或'K’键,(您可以将其中的一系列代码编码到"keyHandler“函数中以获得多个键),然后在within循环中调用:

代码语言:javascript
复制
    state = GetAsyncKeyState('k');
    state1 = GetAsyncKeyState('K'); 
    if ((0x80000000 & state) || 
        (0x80000000 & state1))
    {    
             //do something here
    }

http://msdn.microsoft.com/en-us/library/4e2ess30.aspx返回自程序开始执行以来发生的系统时钟周期数。时钟滴答的数量可以包括其他进程使用的时间。若要将时钟周期数转换为秒数,请用CLOCKS_PER_SEC除以得到最近毫秒的近似值。

Note time.h在我的环境中将CLOCKS_PER_SEC定义为:

代码语言:javascript
复制
#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秒。

另一种选择,这一种给出毫秒的分辨率:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724338%28v=vs.85%29.aspx

例:

代码语言:javascript
复制
SYSTEMTIME s;
GetLocalTime(&s); 
swprintf_s(buff, L"[%02d:%02d:%02d:%d]\t", s.wHour, s.wMinute, s.wSecond, s.wMilliseconds);

其中定义了SYSTEMTIME:

代码语言:javascript
复制
typedef struct _SYSTEMTIME {
    WORD wYear;
    WORD wMonth;
    WORD wDayOfWeek;
    WORD wDay;
    WORD wHour;
    WORD wMinute;
    WORD wSecond;
    WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23063402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档