回答編集履歴

1

ビットマップをスレッド間で共有することについて実験

2022/11/24 03:57

投稿

KOZ6.0
KOZ6.0

スコア2626

test CHANGED
@@ -38,3 +38,42 @@
38
38
 
39
39
  WOW64 では使えないと書いてありましたが、アプリの拡大鏡も 64bit になったみたいですし、使えるようになったみたいですね。
40
40
 
41
+ ### 追記
42
+ スレッド間でビットマップを共有して大丈夫かなと思ったので実験してみました。
43
+
44
+ ```CSharp
45
+ using System;
46
+ using System.Drawing;
47
+ using System.Threading.Tasks;
48
+
49
+ internal class Program
50
+ {
51
+ static void Main(string[] args) {
52
+ var bitmap = new Bitmap(100, 100);
53
+ Task.Run(() => DrawToBitmap(bitmap));
54
+ Task.Run(() => DrawFromBitmap(bitmap));
55
+ Console.ReadKey();
56
+ }
57
+
58
+ static void DrawToBitmap(Bitmap bitmap) {
59
+ while (true) {
60
+ using (var g = Graphics.FromImage(bitmap)) { // ここでエラー
61
+ g.CopyFromScreen(new Point(0, 0), new Point(0, 0), bitmap.Size);
62
+ }
63
+ Console.WriteLine("DrawToBitmap");
64
+ }
65
+ }
66
+
67
+ static void DrawFromBitmap(Bitmap bitmap) {
68
+ var temp = new Bitmap(bitmap.Width, bitmap.Height);
69
+ while (true) {
70
+ using (var g = Graphics.FromImage(temp)) {
71
+ g.DrawImage(bitmap, new Point(0, 0));
72
+ }
73
+ Console.WriteLine("DrawFromBitmap");
74
+ }
75
+ }
76
+ }
77
+ ```
78
+ しばらく実行してみると、 System.InvalidOperationException: 'オブジェクトは現在他の場所で使用されています。'が出ます。
79
+ やはり、ビットマップを切り替えつつ描画する必要があるようです。