Formでつくって、とても遅い気がしたので、WPFにしたいと思ったところからはじまる。
いろんなところを検索して、キャプチャしたビットマップデータを表示するところまではできた。
しかし、リアルタイムで更新するにはタイマーか・・・ツールボックスに無い。
Thread.Timerを使うと、Imageへビットマップを設定するところで、違うスレッドが所有してるから変更できないとかの例外が発生する。
で、探して、見つけた↓。
WPF のスレッド: Dispatcher を使用して応答性の高いアプリケーションを構築する
そうそう、BackgroundWorker使えるんだよ。
じゃぁ、ってことで、backgroundWorker_DoWorkに全部処理を突っ込んだら、同じ例外。
backgroundWorker_RunWorkerCompletedに処理を移したら、問題なし。
で、Image.Sourceに突っ込むところだけをbackgroundWorker_RunWorkerCompletedに残してあとはbackgroundWorker_DoWorkへ移動。
例外復活。
Sourceに突っ込むために、ビットマップをBitmapSourceに突っ込む処理もbackgroundWorker_RunWorkerCompletedでやらなきゃならんらしい。
backgroundWorker_RunWorkerCompletedはUIと同じスレッドで動作するらしく、そのため、UI(WPF)系のコンポーネント操作で例外が出ないらしい。
覚えておこう。
そうこうして、一応できたわけだが、画面取得間隔を短くすると、メモリリークで(はないけれど)システムが重くなる。
おまけに、画面キャプチャする部分はFormアプリからの流用なので、多分、ここもネックになっているようだ。
まだまだ修行が足りない。
コメントしちゃいなよ