C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: マルチスレッドでの画像管理方法


(過去ログ 138 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■81265 / inTopicNo.1)  マルチスレッドでの画像管理方法
  
□投稿者/ だんご (10回)-(2016/09/05(Mon) 19:25:03)

分類:[.NET 全般] 

VBを使い、取得した画像を複数のスレッドから参照するプログラムを書いています。
今のところ、
1、ネット上から画像を取得
2、メインスレッドで画像のキャッシュを保存しておくクラスへ画像を渡し、更新をお願いする
3、キャッシュのクラスが更新を完了したのち、そのまま(メインスレッド)RaiseEventで更新完了の通知
4、イベントを受け取った各画像処理クラス(それぞれ別スレッド)が画像を取得し各処理を行う

となっているのですが、キャッシュに画像を取得しに来る各処理クラスがそれぞれ違うスレッドのため、スレッドセーフを行う必要があります。

Public Function GetImg(ByVal type As IMGTYPE) As Bitmap
       Dim img As Bitmap
       Try
           ' リーダーロックを取得
           rwLock.AcquireReaderLock(Timeout.Infinite)
           img = New Bitmap(cashlist.Item(IMGTYPE)) 'cashlistは画像をキャッシュしておくDictionary型
       Finally
           rwLock.ReleaseReaderLock()
       End Try
       Return img
End Function

そこで画像を返す関数を上記のように書いたのですが、 img = new Bitmap(...のところで
"オブジェクトは現在他の場所で使用されています"とエラーが出てしまいました。

マルチスレッドは苦手なのでいまいちこの手の処理をどう書けばよいのかわかりません。
改善点を教えてください。よろしくお願いします。

VB
Visual Studio 2015

引用返信 編集キー/
■81277 / inTopicNo.2)  Re[1]: マルチスレッドでの画像管理方法
□投稿者/ Jitta (209回)-(2016/09/06(Tue) 10:27:28)
No81265 (だんご さん) に返信

各処理クラスは、読み取った画像に処理をして、その処理結果をどうするのでしょうか。
別のところへ出力するなら、スレッドセーフは関係ありません。
同じファイルに出力するなら、実行の順番が重要になりますが、それはどう考えていらっしゃるのでしょうか?

new bitmap(ファイル名) とすると、ビットマップが有効な間、ファイルを排他処理します。
ある意味、その他のロックオブジェクトは不要になります。
メモリストリームなどに吸い上げて、元のファイルは開放します。
引用返信 編集キー/
■81319 / inTopicNo.3)  Re[2]: マルチスレッドでの画像管理方法
□投稿者/ だんご (11回)-(2016/09/07(Wed) 13:55:30)
No81277 (Jitta さん) に返信
>
> 各処理クラスは、読み取った画像に処理をして、その処理結果をどうするのでしょうか。
> 別のところへ出力するなら、スレッドセーフは関係ありません。
> 同じファイルに出力するなら、実行の順番が重要になりますが、それはどう考えていらっしゃるのでしょうか?


ご返信ありがとうございます。
画像はファイル出力しません。画面上に表示したり、その画像から得られた情報を表示するものになります。


No81277 (Jitta さん) に返信
>
> new bitmap(ファイル名) とすると、ビットマップが有効な間、ファイルを排他処理します。
> ある意味、その他のロックオブジェクトは不要になります。


色々と試してみましたが、結局GetImgをSyncLockで制御するか同一スレッドから呼び出す以外エラーが出るだけでした…。
またエラーは、GetImgが複数のスレッドから同時に呼び出されたときだったのでキャッシュの画像データをうまく処理できていないのだと思うのですがもうお手上げです…。


> メモリストリームなどに吸い上げて、元のファイルは開放します。

すみません、これを試してみたいのですがプログラムが分かりません。
具体的なプログラムをお願いできますでしょうか。
引用返信 編集キー/
■81320 / inTopicNo.4)  Re[3]: マルチスレッドでの画像管理方法
□投稿者/ Jitta (210回)-(2016/09/07(Wed) 14:29:37)
No81319 (だんご さん) に返信

「new bitmap ロック」で検索
http://neareal.net/index.php?Programming%2F.NetFramework%2FWPF%2FWriteableBitmap%2FLoadReleaseableBitmapImage
引用返信 編集キー/
■81322 / inTopicNo.5)  Re[4]: マルチスレッドでの画像管理方法
□投稿者/ だんご (12回)-(2016/09/07(Wed) 18:05:40)
No81320 (Jitta さん) に返信
> ■No81319 (だんご さん) に返信
>
> 「new bitmap ロック」で検索
> http://neareal.net/index.php?Programming%2F.NetFramework%2FWPF%2FWriteableBitmap%2FLoadReleaseableBitmapImage

ありがとうございます。
それで試してみましたが不安定だったため、SyncLockで対応することにしました。
失礼いたしました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -