Синхронизация двух задач ppl в метро-приложении Windows 8

Это приложение камеры метро от 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;
    });
}
}

person Chris_vr    schedule 06.09.2012    source источник


Ответы (1)


В WinRT вы можете использовать класс concurrency::event. Метод event::wait должен стать хорошей заменой WaitforSingleObject

person yms    schedule 07.09.2012