質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

4338閲覧

【WPF/C#】非同期処理内のInvokeでImage.Sourceに指定した場合、画像描写処理が行われない

re-re-

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

2クリップ

投稿2020/05/07 17:53

Visual StudioでWPFを用いてGUIアプリを開発中です。非同期処理を開発しています。
処理の内容は

  • ボタンが押されたら非同期処理に入る
  • リスト該当パスを定期的に確認(1秒に一度)確認し、作業ファイル置き場にコピー(ループスタート)
  • Image.Souceにコピーした該当ファイルを指定する(描写)
  • 処理時間をViewListに描写
  • ループスタートに戻る

といった感じです。該当部分のみ記述します。このコードでコンパイルは問題なく通るのですが、GUIアプリのImageウィンドウに画像が表示されません。一方で、同様にUI処理部分としてInvoke内で記述しておりますlistViewへの追加処理はうまく描写できます。長い時間詰まってしまいましたので、申し訳ありませんが、アドバイスをご教授いただきたく思っております。なおFile.deleteが悪さをしているのではないかと思い、消してみましたがだめでした。

C#

1 private async void show_image(object sender, RoutedEventArgs e) 2 { 3 ShowButton.IsEnabled = false; 4 5 try 6 { 7 await Task.Run(() => 8 { 9 while(true) 10 { 11//----------async loop start------------/ 12 13 String origin_image_path = "**.jpg"; 14 String dst_image_path ="***.jpg" 15 File.Copy(origin_image_path, dst_image_path, true); 16 17 //lock less bitmap 18 MemoryStream data = new MemoryStream(File.ReadAllBytes(dst_image_path)); 19 WriteableBitmap wbmp = new WriteableBitmap(BitmapFrame.Create(data)); 20 data.Close(); 21 22 this.Dispatcher.Invoke((Action)(() => 23 { 24 listView.Items.Add(new string[] { str_date, "Start" }); 25 listView.Items.Add(new string[] { end_date, "End" }); 26 this.MainImage.Source = wbmp; 27 28 })); 29 30 File.Delete(dst_image_path); 31 System.Threading.Thread.Sleep(1000/60); 32//-------------async loop end---------------/ 33 } 34 }); 35 } 36 catch 37 { 38 39 } 40 finally 41 { 42 ShowButton.IsEnabled = true; 43 44 } 45 46 47 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

以下の部分を

cs

1 this.Dispatcher.Invoke((Action)(() => 2 { 3 listView.Items.Add(new string[] { str_date, "Start" }); 4 listView.Items.Add(new string[] { end_date, "End" }); 5 this.MainImage.Source = wbmp; 6 7 }));

以下のようにすることでなんとかできるようになりました。
WPFのBitmapの取り扱いってややこしいんですね~

cs

1 this.Dispatcher.Invoke((Action)(() => { 2 listView.Items.Add(new string[] { str_date, "Start" }); 3 listView.Items.Add(new string[] { end_date, "End" }); 4 //ここから 5 BitmapImage bmp = new BitmapImage(); 6 bmp.BeginInit(); 7 bmp.CacheOption = BitmapCacheOption.OnLoad; 8 bmp.UriSource = new Uri(dst_image_path); 9 bmp.EndInit(); 10 WriteableBitmap wbmp = new WriteableBitmap(bmp); 11 //ここまで 12 this.MainImage.Source = wbmp; 13 }));

投稿2020/05/09 15:36

Hey_CH

総合スコア437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

一つづつ段階を追って潰しましょう。

  • WriteableBitmapのプロパティには期待した値が入っていますか
  • 非同期ではなく、同期処理にしたら画像は表示されますか
  • ループ無しで単一画像決め打ちで表示されますか

何となくMemoryStream~File.DeleteまでをInvokeの中に入れれば普通に動きそうな気はします。

MSのWritableBitmapクラスの注釈を読んだ限り、WriteableBitmapはUIスレッドに紐づけられるので、非同期でアクセスするのであれば、あらかじめUIスレッド側でWriteableBitmapを作成し、Task側でLockして書き込むというのが正しい手順のようです。
WriteableBitmap クラス

WriteableBitmap自体を使わないという手もあるようです。
WritePixels of WriteableBitmap in a Task - Stack Overflow

投稿2020/05/08 00:05

編集2020/05/08 01:21
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問