0

最近、ビットマップへのアクセスで多くの厄介な 問題が発生しており、アプリケーションの設計を再評価する必要があると考え始めています。

現在、他の 2 つのオブジェクトを作成する 1 つのオブジェクトがあります。これらのうちの 1 つは一連のビットマップ (たとえば、Web カメラから) を提供し、もう 1 つは一連の座標ペア (たとえば、マウスまたはタッチパッドから) を提供します。親オブジェクトには、子オブジェクトが生成するイベントのリスナーがあります。イベントには、新しい情報 (ビットマップまたは座標) をペイロードとして運ぶカスタム引数があります。例えば:

public class NewImageEventArgs : EventArgs
{
    public NewImageEventArgs(Bitmap image)
    {
        Image = image;
    }
    public Bitmap Image { get; private set; }
}

親オブジェクトのリスナー メソッドは、ペイロードをオブジェクト レベルの表現にコピーします。いずれかのリスナー (ビットマップまたは座標) がトリガーされると、続いて共有メソッドが呼び出され、ビットマップと座標の両方を使用して計算が行われます。

private void PointerModule_NewPosition(object sender, NewPositionEventArgs e)
{
    this.p = e.Position;
    this.Invalidated();
}

OutOfMemory および InvalidOperation (「オブジェクトは現在、別の場所で使用されています」) 例外で繰り返し発生する問題は、新しいイベントがそれぞれ別のスレッドにある可能性があるという事実に起因しているように思えます。ビットマップが 1 つのスレッドで使用されている場合、別のスレッドが同時にアクセスしようとすると例外が発生します。

プログラムの形を根本的に変える必要がありますか? この種の問題を解消するために講じることができる予防策はありますか?

4

1 に答える 1

0

編集:あなたの質問を読み直しましたが、あなたが尋ねたものとは少し異なる質問に答えたかもしれません. ただし、「オブジェクトが他の場所で使用されている」という例外で同じ問題と戦い、学んだ教訓は下部のリンクにまとめられています。bitmap.Clone() も new Bitmap(source) もディープ イメージ コピーを作成しません。これにより、例外が発生しています。

私のアプリケーションでは、パターンを使用します:

public class ImageProvider()
{
public event EventHandler LiveImageUpdated;
private object _currentImageLock = new object();

private Bitmap _currentImage;
public Bitmap CurrentImage
{ 
    get    
      {
       lock (_currentImageLock)
         {
            return DeepImageCopy(_currentImage)
         }
       }
     private set
     {
       lock(_currentImageLock)
       {
            _currentImage = value
       }
        if (LiveImageUpdated != null)
        {
          foreach (Delegate del in LiveImageUpdated.GetInvocationList())
          {
              EventHandler handler = (EventHandler)del;
              handler.BeginInvoke(this, EventArgs.Empty, null, null);
           }
        }
     }
}

}

そして、私はこの質問をしました: ビットマップディープコピーを作成する方法

アプリケーションは問題なく動作します。したがって、基本的には、引数として新しいイメージをプッシュする部分をスキップしました。リスナーはイメージのディープ コピーを要求し、イメージを共有していません。性能的には問題なく動作します。

于 2012-10-04T11:44:36.577 に答える