1

私はまだ読むことを理解していない小さなn00bの質問、多くのStackOverflowの回答。

colorData変数は、Kinect によって 25 回/秒更新されるバイト配列です。UI コンポーネントはありません。

WriteableBitmap と WritePixels が同じタスクのスレッドで呼び出されたと思いました。しかし、まだ System.InvalidOperationException が発生します。ループごとに新しい WriteableBitmap を作成すると、エラーは発生しません。

WriteableBitmap を効率的に再利用するには、コードをどのように修正すればよいですか?

private async Task DoJob(TimeSpan dueTime, TimeSpan interval, CancellationToken token) {

  if (dueTime > TimeSpan.Zero)
    await Task.Delay(dueTime, token);

  WriteableBitmap bitmap = NewColorBitmap(colorW, colorH);

  // Repeat this loop until cancelled.
  while (!token.IsCancellationRequested) {

    try {
      bitmap.WritePixels(
        new Int32Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight),
        colorData, bitmap.PixelWidth * Bgra32BytesPerPixel, 0);
    } 
    catch(Exception ex){
      // System.InvalidOperationException: 
      // The calling thread cannot access this object 
      // because a different thread owns it.
    }

    // Wait to repeat again.
    if (interval > TimeSpan.Zero)
      await Task.Delay(interval, token);
    }
}
4

2 に答える 2

0

WriteableBitmap.WritePixels メソッドの呼び出し

高さと幅の値を確認します。おそらく、バイト配列のサイズが十分ではありません! ストライドは、メモリ内のピクセルの 1 つの行からメモリ内のピクセルの次の行までのバイト数です。

于 2013-09-13T06:27:54.907 に答える
0

WriteableBitmap は WPF レンダリング スレッドにバインドされているため、プロセス間通信のために複雑なコードを実行する必要があります。

そのため、私はそれを使用しなくなり、代わりに Emgu CV (Open CV) の Image を使用します。これもパフォーマンスが優れています。

于 2013-08-14T20:51:45.343 に答える