2017-02-17 12 views
0

Microsoftライフキャッシュからのフィードを表示できるウィンドウを作成しようとしているときに問題が発生しました。基本的に私は1つまたは複数のスクリーンショットを取ることができますが、スレッド内にコードを挿入すると(UIをブロックせずにリアルタイムでフィードを表示できるようになります)、APIが失敗し、デバイスが見つからないことがわかります。ここでは、コードは次のとおりです。Microsoft LifeCam ESCAPI - タスク内ではなく、UI内で働いています

C++ CLI:

EasyPicture::EasyPicture() 
{ 
    int devices = setupESCAPI(); //returns 1 if run synchronously, 0 otherwise 
    _apiInitialized = devices > 0; 
    std::cout << (_apiInitialized ? "Escapi initialized successfully!\n" : "Failed to init escapi.\n"); 
    _capture = new struct SimpleCapParams(); 
} 

bool EasyPicture::GetFrame(void* buffer, int width, int height) 
{ 
    if (!_apiInitialized || buffer == nullptr || width == 0 || height == 0) 
     return false; 
    pin_ptr<int> buffPtr = reinterpret_cast<int*>(buffer); 

    _capture->mTargetBuf = buffPtr; 

    _captureInitialized = _capture->mWidth == width && _capture->mHeight == height; 

    _capture->mWidth = width; 
    _capture->mHeight = height; 

    if (!_captureInitialized) 
    { 
     //works if run synchronously, otherwise returns 0 (failed) 
     if (initCapture(0, _capture) == 0) //Maybe the device is already in use 
     { 
      if (Disconnect()) // try to disconnect it 
      { 
       if (initCapture(0, _capture) == 0) 
       { 
        _captureInitialized = false; 
        return false; 
       } 
       _captureInitialized = true; 
      } 
      else 
      { 
       _captureInitialized = false; 
       return false; 
      }    
     } 
    } 

    doCapture(0); 

    while (isCaptureDone(0) == 0) 
    { 
     /* Wait until capture is done. */ 
    } 

    return true; 
} 

C#コード

private void UserControl_Loaded(object sender, RoutedEventArgs e) 
    { 
     _cts = new CancellationTokenSource(); 
     _frameLoop = new Task(() => 
     { 
      Frame = new Bitmap(_width, _height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
      var BoundsRect = new System.Drawing.Rectangle(0, 0, _width, _height); 
      BitmapData bmpData = Frame.LockBits(BoundsRect, ImageLockMode.WriteOnly, Frame.PixelFormat); 
      int counter = 0; 
      while(!_cts.IsCancellationRequested) 
      { 
       unsafe 
       { 
        if (!_picHelper.GetFrame((void*)bmpData.Scan0, _width, _height)) 
        { 

        } 
        else 
        { 
         Frame.Save("Test_" + counter + ".bmp"); //For now i just save the frame, i have yet to figure out how to put the bitmap in xaml without copying it... 
         /* Image = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
          Frame.GetHbitmap(), 
          IntPtr.Zero, 
          System.Windows.Int32Rect.Empty, 
          BitmapSizeOptions.FromWidthAndHeight(_width, _height));*/ 
        } 
       } 
       Thread.Sleep(500); 
      } 
      Frame.UnlockBits(bmpData); 
     },_cts.Token); 
     _frameLoop.RunSynchronously();// Start(); Works only with RunSynchronously, but blocks ui of course 
    } 

誰かが正しい方向に私を指すことができますか?

答えて

0

コンパイラがタスクを管理します。匿名のデリゲートを完全に削除し、イベントハンドラにループを入れ、Thread.Sleepの代わりにawait Task.Delayを使用します。

関連する問題