1

Kinect デバイスからビデオを受信して​​います。サーバーはフレームごとにビデオを送信し、クライアント側ではフレームを受信しますが、BitmapSource を使用するとイメージ コントロールでちらつき始めます。その後、CPU 使用率の増加を担当する関数を作成し、WriteableBitmap クラスを使用しましたが、新しい問題が発生しました。「呼び出し元のスレッドはオブジェクトにアクセスできませんが、別のスレッドがそれを所有しています」というエラーが表示されます。dispather.invoke を使用します。問題を解決するために、同じエラーが発生しています。

public partial class MainWindow : Window { TcpClient クライアント; NetworkStream ns; スレッドビデオフレーム; WriteableBitmap vediofram = null;

    public MainWindow()
    {
        InitializeComponent();
        client = new TcpClient();
        client.Connect("127.0.0.1", 9000);
        vedioframe = new Thread(Display_Frame);
       vedioframe.Start();


    }
    public void Display_Frame()
    {

        ns = client.GetStream();     
        while (true)
        {
            byte[] vedio = new byte[1228800];
            ns.Read(vedio, 0, vedio.Length);
            try
            {
                if (vediofram == null)
                {
                    vediofram = new WriteableBitmap(640, 480, 96, 96, PixelFormats.Bgr32, null);

               }
               else
                {

                    vediofram.WritePixels(new Int32Rect(0, 0, 640, 480), vedio, 640 * 4, 0);

               }
                Update_Frame(vediofram);

            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }

            // Dispatcher.Invoke(new Action(() => { BitmapSource s = BitmapSource.Create(640, 480, 96, 96, PixelFormats.Bgr32, null, vedio, 640 * 4);
            // Vedio.Source = s;   
            /// }));

       }
    }
    void Update_Frame(WriteableBitmap src)
    {
        Dispatcher.Invoke(new Action(() => { Vedio.Source = src; }));

    }

}
4

1 に答える 1

0

問題はWriteableBitmap、バックグラウンド スレッドで を作成していることです。これは UI スレッドで作成する必要があり、データを UI スレッドに渡してビットマップを更新する必要があります。

WriteableBitmap での非同期操作に対する最初の回答では、さらに詳しく説明しています。

于 2013-06-27T21:13:22.980 に答える