回答編集履歴

3

現状のコードの問題点について追記

2021/12/10 07:28

投稿

teamikl
teamikl

スコア8681

test CHANGED
@@ -50,6 +50,8 @@
50
50
 
51
51
 
52
52
 
53
+
54
+
53
55
  ----
54
56
 
55
57
  > 当初、play_animeメソッド内で windowのupdateをいくらしても、windowsが更新されないのであれば、意味がないのだと思い、この更新メソッドを一番下に記載しました。
@@ -65,3 +67,31 @@
65
67
 
66
68
 
67
69
  ※ 厳密には、GUIのイベントループを動かしてるスレッドで。大抵の場合は、メインスレッド。
70
+
71
+
72
+
73
+
74
+
75
+ ----
76
+
77
+ 追記: 他の問題点
78
+
79
+
80
+
81
+ - `def play_anim(self):` ... この関数はトップレベルで宣言されてます、
82
+
83
+  クラス内ではないのでメソッドを想定した使いかたは出来ません。
84
+
85
+ - args=[DATA] ... 呼び出される側の関数で想定されてる値と異なります。
86
+
87
+ - thread.join ... join はスレッドの終了を待ちます。
88
+
89
+  イベントループ内で使うと、イベントループは停止しスレッド側に処理が移るので、
90
+
91
+  GUIイベントが処理されない → ウィンドウが応答なしの原因になります。
92
+
93
+
94
+
95
+ 現状のコードの問題点ですが、スレッドの利用方法から見直す必要があるので、
96
+
97
+ エラーを修正して期待通りに動くとはいきません。

2

説明補足

2021/12/10 07:28

投稿

teamikl
teamikl

スコア8681

test CHANGED
@@ -34,11 +34,15 @@
34
34
 
35
35
 
36
36
 
37
- 解消法としては、上記のサンプルの様に
37
+ 解消法としては、(追記・補足: スレッドを使う場合は) 上記のサンプルの様に
38
38
 
39
39
  サブスレッドからは通知のみを行い、メインスレッド側でGUI関連の処理が行われるような構成にして下さい。
40
40
 
41
+
42
+
41
- サブスレッド側で行う処理が時間の掛かる処理でない場合は、タイマーイベントを使う方法もあります
43
+ 他の案で、サブスレッド側で行う処理が時間の掛かる処理でない場合は、タイマーイベントを使う方法もあります
44
+
45
+ 処理内容次第ですが、用途がアニメーションのみであれば、タイマーの方が適切な場合もあり。
42
46
 
43
47
 
44
48
 

1

説明補足

2021/12/08 04:29

投稿

teamikl
teamikl

スコア8681

test CHANGED
@@ -57,3 +57,7 @@
57
57
  明示的に更新する方法もありますが、サブスレッドからのGUIの直接操作自体を回避した方が良いです。
58
58
 
59
59
  上述した方法で、「GUIの操作はメインスレッドからのみ」とすると、必然的に解消されるはずです。
60
+
61
+
62
+
63
+ ※ 厳密には、GUIのイベントループを動かしてるスレッドで。大抵の場合は、メインスレッド。