首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从不同线程调用的XInputGetState和XInputSetState

从不同线程调用的XInputGetState和XInputSetState
EN

Stack Overflow用户
提问于 2014-07-25 22:57:06
回答 2查看 1.4K关注 0票数 1

我有一个线程来捕获控制器输入。这是这个线程所做的唯一事情--它每隔x毫秒调用一次XInputGetState(),并将结果存储在同步循环缓冲区中。当达到某种条件时,我有另一个线程通过XInputSetState()振动控制器来响应这个输入。

换句话说,一个线程只调用XInputGetState(),而另一个线程只调用XInputSetState()。从理论上讲,任何一个函数都不可能同时被多次调用。在没有同步的情况下这样做是否仍然不安全?

注意:这两个函数在一组完全不同的数据上工作,但是实现很可能是对不同步的东西进行读/写。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-25 23:21:29

是的,在这种情况下,因为XInput API对每个外部入口点调用都有一个关键的节锁。

顺便说一句,在使用XInput时,请看一下博客文章。只有这两个API,您就可以使用Windows内置的XInput 9.1.0和以后的操作系统,它的头位于Windows8.xSDK中,它避免了使用遗留DirectSetup部署XInput 1.3的任何麻烦。当然,如果您正在使用Windows应用程序,您只需使用Windows8.xOS中的XInput 1.4,并且标头位于Windows8.xSDK中。唯一需要使用遗留DirectX SDK的情况是在Windows7或更早版本上获得音频捕获/播放支持。

票数 2
EN

Stack Overflow用户

发布于 2014-07-25 23:04:29

“.并将结果存储在同步循环缓冲区中。我有另一个线程通过.响应此输入。”直接与您的另一条语句相矛盾:“不可能同时调用任何一个函数”,因为操作系统不能保证您的线程在被推回等待状态之前完成它正在做的任何事情的。

换句话说:在理论上(在实践中也是如此!)您的读取线程可能处于将数据推送到共享缓冲区的中间,并由调度程序和计划在共享缓冲区处于更新过程中运行的写入线程交换掉。

一般来说,一旦您有了对共享资源的多个独立访问(在您的例子中-“同步循环缓冲区”),您最好做正确的事情:)

如果在您的场景中,您仍然决定使用不安全的解决方案,那么最终可能会出现那些每月都会发生一次麻烦的错误,这些错误几乎是不可能调试的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24965682

复制
相关文章

相似问题

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