4

タイトルには、いくつかの質問がありますが、どれも私を助けたり、私の問題を解決するように指示したりできませんでした.

C# winform を使用して、リアルタイムまたはほぼリアルタイムのイメージング アプリケーションを構築しています。

しかし、winformでPictureBoxに画像を割り当てる

pictureBox.Image = image; 

基本的Object is currently in use elsewhere.に、5〜20分でランダムな例外が発生します。

この問題に関する資料を検索しましたが、適切な解決策が見つかりませんでした。プログラムが単に画像をキューから表示するように設定しているときに、エラーが発生しました。したがって、その画像を他のスレッドで使用する方法はありません。

現時点では、winform がイメージング アプリケーションに適したプラットフォームかどうかはわかりません。WPF などの別のプラットフォームに移行する必要がありますか?

経験者からのアドバイスが欲しい。

更新:ナタナエルが指摘したように、マルチスレッドからピクチャボックスにアクセスできたので、マルチスレッドがピクチャボックスのイメージにアクセスできると仮定しました。したがって、上記の行を次のように変更すると、エラーは発生しなくなりました。

      private void SetImage(Bitmap image) 
      {
            if (this.pictureBox.InvokeRequired)
            {
                SetImageCallback callback = new SetImageCallback(SetImage);
                this.BeginInvoke(callback, new object[] { image });
            }
            else
            {
                pictureBox.Image = image;
            }
      }
4

3 に答える 3

5

私があなたの質問を正しく理解していれば、あなたは複数のスレッドからこの画像ボックスにアクセスしています。WinForms は内部で GDI+ を使用しますが、これはスレッド セーフではありません。WinForms は、作成されたスレッドからのみ UI オブジェクトにアクセスすることを強制しません。それはあなたに任せますが、あなたが発見したように、最終的にはエラーが発生します.

GUI スレッドが画像を更新するように、ワーカー スレッドから GUI スレッドにメッセージを投稿してみてください。これにより、表示されているエラーが解決されるはずです。

WPF に移行すると、同様のスレッドの問題が発生します。WPF は、UI オブジェクトを作成したスレッドのみが変更できることを厳密に強制します。WPF では、Invoke メソッドを使用して、正しいスレッドに画像ボックスを操作させることができます。

それ以外の場合、前述のように、2 つのパフォーマンスの違いは重要ではありません。即時モードの描画が保持モードよりも必要かどうか、または優先するかどうかを検討する必要があります。フォームは即時で、WPF は保持されます。

于 2012-09-10T17:39:20.220 に答える
1

どちらのテクノロジーも、ユーザーがやりたいことをうまく実行できるようにする必要があります。どちらがより良い選択であるかは、以前のスキルと経験、およびプロジェクトの正確な要件によって異なります。

パフォーマンスについて質問している場合、要素があまり多くないかなり単純なインターフェイスがあり、基本的に 1 つの大きな画像を表示するだけであれば (変更して更新します)、winforms と wpf のパフォーマンスに大きな違いは見られません (いいえ3d、大きな要素数なし)。

于 2012-09-10T17:21:24.893 に答える
-2
private void ThreadSafe(MethodInvoker method)
{
    try
    {
        if (InvokeRequired)
            Invoke(method);
        else
            method();
    }
    catch
    { }
}

///////////////////////
pictureBox1.Image = img;
于 2016-02-10T12:53:43.157 に答える