Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos Gamepad热插拔不起作用_Macos_Sdl 2_Gamepad - Fatal编程技术网

Macos Gamepad热插拔不起作用

Macos Gamepad热插拔不起作用,macos,sdl-2,gamepad,Macos,Sdl 2,Gamepad,在OS X中,我的游戏板在应用程序启动时在SDL\u PollEvent()中被正确识别。但是,当我尝试热插拔新游戏板或移除旧游戏板时,SDL\u polleevent()不会触发SDL\u controllerdevieceaded或SDL\u controllerdevievemoved。当我热插拔游戏控制器时,相同的代码在Windows中正常工作 更有趣的是,如果我调整应用程序窗口的大小,热插拔就可以工作。调整大小事件后,将触发所有热插拔事件。似乎gamepad事件被放在一个等待队列中,当

在OS X中,我的游戏板在应用程序启动时在
SDL\u PollEvent()
中被正确识别。但是,当我尝试热插拔新游戏板或移除旧游戏板时,
SDL\u polleevent()
不会触发
SDL\u controllerdevieceaded
SDL\u controllerdevievemoved
。当我热插拔游戏控制器时,相同的代码在Windows中正常工作

更有趣的是,如果我调整应用程序窗口的大小,热插拔就可以工作。调整大小事件后,将触发所有热插拔事件。似乎gamepad事件被放在一个等待队列中,当resize事件发生时,该队列被清除。我的
SDL\u polleevent()
代码非常标准,如下所示

case SDL_CONTROLLERDEVICEADDED:
        if (SDL_IsGameController(e.cdevice.which))
        {
            SDL_GameController *pad = SDL_GameControllerOpen(e.cdevice.which);

            if (pad)
            {
                SDL_Joystick *joy = SDL_GameControllerGetJoystick(pad);
                int instanceID = SDL_JoystickInstanceID(joy);
                if(m_gameControllers.count(instanceID) == 0)
                {
                    m_gameControllers.insert(std::make_pair(instanceID, pad));
                }
            }
        }
    break;

    case SDL_CONTROLLERDEVICEREMOVED:
    {
        auto it = m_gameControllers.find(e.cdevice.which);
        if (it != m_gameControllers.end())
        {
            SDL_GameController* pad = m_gameControllers[e.cdevice.which];
            SDL_GameControllerClose(pad);
            m_gameControllers.erase(it);
        }
    }
    break;

还有其他人经历过这种情况吗?

经过一番努力,我找到了解决方案:从主线程调用
SDL\u PollEvent()
。最初,我从CVDisplayLink线程调用gamepad处理方法,从而产生所描述的行为

在我的例子中,解决方案只是将
dispatch\u async
调用添加到我的gamepad处理函数中

dispatch_async(dispatch_get_main_queue(),^ { handleGamePad();});