BeginInvoke デリゲート呼び出しを使用して別のスレッドから更新されるサード パーティのイメージ表示コントロールを含む Windows フォーム ユーザー コントロールがあります。
CPU 負荷が高い場合、UI がロックアップします。デバッガーをアタッチすると、サードパーティのイメージ コントロールを更新しているコードの同じ行に常に表示されます。
public ICogImage DisplayImage
{
get { return this.ResultImageCogDisplay.Image; }
set
{
this.BeginInvoke((ThreadStart)delegate
{
this.ResultImageCogDisplay.Image = value;
});
}
}
セッターの実装をコメントアウトすると、問題はなくなります。
なぜこれが起こっているのか誰でも説明できますか?
いくつかの詳細情報:
- 画像更新イベントは、フレーム グラバー カードから定期的に (~200ms) 生成されます。イベントは別のスレッドで発生します。
- サードパーティのイメージ コントロールは ActiveX を使用していると思います。これは Cognex のビジョン処理フレームワークの一部です。
- 画像は約です。900x800 8 ビット グレースケール
- フォームにはこれらのコントロールが 4 つあり、それぞれが異なる画像の異なるスレッドから供給されます。
- IsInvokeRequired() チェックの有無にかかわらず試してみましたが、違いはないようです。
CPU 負荷が高い状態でヒットしている PostMessage キューのメッセージ数に制限はありますか?