2014-12-03 27 views
-1

这是我的代码:C++/CLI代码不进入create_task功能。那么一部分

void MainPage::OnNavigatedTo(NavigationEventArgs^ e) 
{ 
XTRACE(L"=========================================will start onNavigated "); 
    auto mediaCapture = ref new Windows::Media::Capture::MediaCapture(); 
    m_mediaCaptureMgr = mediaCapture; 
    IAsyncAction ^asyncAction = m_mediaCaptureMgr->InitializeAsync(); 
try 
{ 
    create_task(asyncAction).then([this](task<void> initTask) 
    { 
     XTRACE(L"=========================================will start onNavigated 2"); 
     try 
     { 
      initTask.get(); 

      auto mediaCapture = m_mediaCaptureMgr.Get(); 
      if (mediaCapture->MediaCaptureSettings->VideoDeviceId != nullptr && mediaCapture->MediaCaptureSettings->AudioDeviceId != nullptr) 
      { 
       String ^fileName; 
       fileName = VIDEO_FILE_NAME; 
       XTRACE(L"=================================Device initialized successful\n"); 
       create_task(KnownFolders::VideosLibrary->CreateFileAsync(fileName, Windows::Storage::CreationCollisionOption::GenerateUniqueName)) 
        .then([this](task<StorageFile^> fileTask) 
       { 
        XTRACE(L"=================================Create record file successful\n"); 
        m_recordStorageFile = fileTask.get(); 
        MediaEncodingProfile^ recordProfile = nullptr; 
        recordProfile = MediaEncodingProfile::CreateMp4(Windows::Media::MediaProperties::VideoEncodingQuality::Auto); 
        stream = ref new InMemoryRandomAccessStream(); 
        return m_mediaCaptureMgr->StartRecordToStreamAsync(recordProfile, stream); 
       }).then([this](task<void> recordTask) 
       { 
        try 
        { 
         recordTask.get(); 
         XTRACE(L"=================================Start Record successful\n"); 
        } 
        catch (Exception ^e) 
        { 

         XTRACE(L"======ERRROR is : %d", e); 
        } 
       }); 
      } 
      else 
      { 

       XTRACE(L"=================================No VideoDevice/AudioDevice Found\n"); 
      } 
      XTRACE(L"=================================WILL EXIT \n"); 

     } 
     catch (Exception^e) 
     { 
      XTRACE(L"============================================ERROR IS: %d\n", e); 
     } 
    } 
    ); 

} 
catch (Exception^e) 
{ 
    XTRACE(L"============================================before create task ERROR IS: %d\n", e); 
} 
XTRACE(L"=================================SLEEP 20000====================================\n"); 
std::chrono::milliseconds dura(20000); 
std::this_thread::sleep_for(dura); 
XTRACE(L"=================================TIME ENDED====================================\n"); 
// stop device detection 
try 
{ 
    XTRACE(L"=================================Stopping Record\n"); 
    create_task(m_mediaCaptureMgr->StopRecordAsync()) 
     .then([this](task<void> recordTask) 
    { 
     try 
     { 
      recordTask.get(); 
      XTRACE(L"=================================Stop record successful: %d\n", stream->Size); 
     } 
     catch (Exception ^e) 
     { 
      XTRACE(L"=================================ERROR while stoping 2: %d\n", e); 
     } 
    }); 
} 
catch (Exception ^e) 
{ 
    XTRACE(L"=================================ERROR try catch 3 stoping: %d\n", e); 
} 

CloseHandle(ghEvent); 

// destruct the device manager 
XTRACE(L"=====================================================================END\n"); 

}

在日志中我看到:

=========================================will start onNavigated 

And then directly: 
===================================================================== 
=================================SLEEP 20000==================================== 

奇怪的是,我在一个单元测试过的代码,它的工作,我创建了一个用户界面新的Windows手机项目,这是行不通的

+1

这是C++/CLI - 的C为.NET运行时平台适配++。请考虑创建一个[SSCCE(http://sscce.org/)为你发布什么具有低信号/噪声比和难以阅读。 – utnapistim 2014-12-03 09:49:20

回答

0

显然,这是因为ThreadSleep的:

std::chrono::milliseconds dura(20000); 
std::this_thread::sleep_for(dura); 

在我工作我使用的是不同的睡眠,由图书馆提供的库项目,将工作。所以这是会导致应用程序阻止自身的线路。 我的工作我的方式解决这个通过在应用2个按钮,用于启动和停止录制。