これは msdn のメトロ カメラ アプリです。このコードは、カメラからプレビューを表示するためのものです。ここでは、カメラのリストがコンボボックスに表示されます。ユーザーはカメラを選択して、選択したカメラのプレビューを表示できますが、カメラを変更すると、最初にリソースが解放されてから開始されます選択したカメラのプレビューは非同期処理であり、バックグラウンドで実行されるため、リリース前に選択したカメラのプレビューを開始し、その間に「m_MediaCaptureMgr」ポインタを削除してプログラムがクラッシュします。
Win 32 では、waitforSingle オブジェクトを使用して同期できます。WinRT と ppl タスクでどのように同期するのが最善かを知りたかったのです。
void CameraApp::MainPage::cmbCameraSelector_SelectionChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::SelectionChangedEventArgs^ e)
{
if(m_DeviceVector.size() > 0)
{
m_CaptureInitSettings->VideoDeviceId = m_DeviceVector[cmbCameraSelector->SelectedIndex]->Id;
InitMediaCapture();
}
}
void CameraApp::MainPage::InitMediaCapture()
{
ReleaseMediaCapture();
//Sleep(3000);
auto _this = this;
m_MediaCaptureMgr = ref new MediaCapture();
task<void> stratPreview(m_MediaCaptureMgr->InitializeAsync(m_CaptureInitSettings));
stratPreview.then([_this]
{
_this->previewElement->Source = _this->m_MediaCaptureMgr;
task<void> startPrev(_this->m_MediaCaptureMgr->StartPreviewAsync());
startPrev.then([=]
{
return _this->GetCameraSettings();
});
});
}
void CameraApp::MainPage::ReleaseMediaCapture()
{
if (m_MediaCaptureMgr )
{
auto prevOp = m_MediaCaptureMgr->StopPreviewAsync();
task<void> releaseMediaCapture(m_MediaCaptureMgr->StopPreviewAsync());
releaseMediaCapture.then([=]
{
m_MediaCaptureMgr = nullptr;
bRelease = false;
});
}
}