来自单独线程的UWP GetAsyncKeyState()

时间:2017-03-03 09:41:27

标签: c++ multithreading uwp uwp-xaml

我正在使用" DirectX 11和XAML应用程序(通用窗口)" vs2015中的模板。我想在每一帧中获得用户的击键。所以我试着将GetAsyncKeyState()放在render-loop中。渲染循环在一个单独的线程中运行:

auto workItemHandler = ref new WorkItemHandler([this](IAsyncAction ^ action)
{
    // Calculate the updated frame and render once per vertical blanking interval.
    while (action->Status == AsyncStatus::Started)
    {
        critical_section::scoped_lock lock(m_criticalSection);
        Update();
        m_sceneRenderer->OnKeyDown();
        if (Render())
        {
            m_deviceResources->Present();
        }
    }
});

// Run task on a dedicated high priority background thread.
m_renderLoopWorker = ThreadPool::RunAsync(workItemHandler, WorkItemPriority::High, WorkItemOptions::TimeSliced);

m_sceneRenderer-> OnKeyDown()是我放置GetAsyncKeyState()的地方。但每当我在while循环中放入m_sceneRenderer-> OnKeyDown()时,所有的DirectX内容都不会被渲染。此外,m_renderLoopWorker将为nullptr并在关闭应用程序时抛出异常。

// Sample3DSceneRenderer.h, truncated
namespace UWP_DX11_XAML_
{
    class Sample3DSceneRenderer
    {
        Sample3DSceneRenderer(Windows::UI::Core::CoreWindow^ window);
        void OnKeyDown();
        Platform::Agile<Windows::UI::Core::CoreWindow^> m_window;
    }
}
// Sample3DSceneRenderer.cpp, truncated
UWP_DX11_XAML_::Sample3DSceneRenderer::Sample3DSceneRenderer(
        Windows::UI::Core::CoreWindow^ window):
m_window(window)
{
}

void UWP_DX11_XAML_::Sample3DSceneRenderer::OnKeyDown()
{
     m_window.Get()->GetAsyncKeyState(Windows::System::VirtualKey::Control);
}

调用m_window的其他成员函数可能会导致同样的问题。

1 个答案:

答案 0 :(得分:0)

您可能希望使用CreateCoreIndependentInputSource(CoreInputDeviceTypes :: Mouse | CoreInputDeviceTypes :: Touch | CoreInputDeviceTypes :: Pen)设置专用输入线程;

此处有一个示例演示了此选项:https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/LowLatencyInput

我还发现了这些类似的文章,讨论优化低输入延迟。

https://docs.microsoft.com/en-us/windows/uwp/gaming/optimize-performance-for-windows-store-direct3d-11-apps-with-coredispatcher

https://blogs.windows.com/buildingapps/2013/12/18/optimizing-directx-apps-for-low-latency-input-and-longer-battery-life/#JPGhHjXExbySmTf7.97