【发布时间】:2017-07-23 08:34:11
【问题描述】:
我在 vs2015 中使用“DirectX 11 and XAML App (Universal Window)”模板。我想在每一帧中获取用户的击键。所以我尝试将 GetAsyncKeyState() 放在渲染循环中。渲染循环在单独的线程中运行:
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() 的地方。但是每当我将 m_sceneRenderer->OnKeyDown() 放入 while 循环时,所有 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 的其他成员函数可能会导致同样的问题。
【问题讨论】:
标签: c++ multithreading uwp uwp-xaml