- PR -

アニメーションgifの動作

1
投稿者投稿内容
やすけ
ベテラン
会議室デビュー日: 2003/08/20
投稿数: 87
投稿日時: 2003-09-10 16:57
中村と申します。
ウィンドウズフォーム上で、Pictureboxのコントロールにアニメーションgifをおいて、
あるコマンドボタンをクリックしたと同時に表示させ、終了まで表示させているのですが、処理時間が長いせいなのか、動きが止まってしまう現象になります。
処理が終了すると、また動き出します。
OS:XP VB.Net2002
こんなコーディングです。
Try
  〜
Me.pic_Sagyou.Visible = True  ←これが、実際にアニメーションgifが設定されているPictureboxです。ここで、表示させている。

aaa = InputBox("XXXを入力してください。", "タイトル") ←インプットボックス
Me.Refresh() ←リフレッシュしないとインプットボックスがいつまでも残っている。
frm.Cursor = System.Windows.Forms.Cursors.WaitCursor ←砂時計表示

  〜 この間の処理時間が3分ぐらいある(テーブルの更新等) 〜

Catch ex As Exception
〜 エラーメッセージの出力 〜
Finally
frm.Cursor = System.Windows.Forms.Cursors.default←砂時計終了
End Try
Me.pic_Sagyou.Visible = False ←アニメーションgifの非表示

雑なコーディングで申し訳ありませんが、
アニメーションgifをどうしても、処理中は動かしておきたいのですが、
なんとかならないでしょうか?
どなたか、ご教授願います。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-09-11 11:10
こんにちは。

 スレッドを分けるか、都度都度リフレッシュをかけてやる必要があります。
やすけ
ベテラン
会議室デビュー日: 2003/08/20
投稿数: 87
投稿日時: 2003-09-12 08:44
中村と申します。
Jittaさん、ありがとうございました。
ループで回している箇所にリフレッシュをすることで
アニメーションgifが動くようになりました。
ありがとうございました。
ところで、そのリフレッシュをいれたことで、
処理自体が遅くなっているような気がします。
リフレッシュを毎回行うとやっぱり
遅くなってしまうのでしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-09-12 08:57
引用:

やすけさんの書き込み (2003-09-12 08:44) より:

ところで、そのリフレッシュをいれたことで、
処理自体が遅くなっているような気がします。
リフレッシュを毎回行うとやっぱり
遅くなってしまうのでしょうか?


 今まで「時間がかかる処理」に全勢力をつぎこんでいたのが、「時間がかかる処理」の他に「ウインドウを再描画する処理」もしなければいけなくなったのです。当然時間がかかるようになります。何とも思っていない人がおおいようですが、実は画面を再描画する処理というのはとても重い処理なのです。初期の頃、ウインドウの内容を描画しながらウインドウを動かすことができなかったとこを思い出してください。

 少しでも低減させるためには、スレッドを分けます。もしくは、pic_Sagyouだけリフレッシュできるなら、そうします。
やすけ
ベテラン
会議室デビュー日: 2003/08/20
投稿数: 87
投稿日時: 2003-09-12 09:19
Jittaさん、返信ありがとうございます。
[/quote]
 少しでも低減させるためには、スレッドを分けます。もしくは、pic_Sagyouだけリフレッシュできるなら、そうします。
[/quote]
まだ、Vb.Net初心者なもので、なんでも質問しますが、具体的に
スレッドを分けるとはどういうことでしょうか?
スレッドとは何ですか?
初心者で申し訳ありませんが、教えてください。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-09-12 13:08
引用:

やすけさんの書き込み (2003-09-12 09:19) より:

まだ、Vb.Net初心者なもので、なんでも質問しますが、具体的に
スレッドを分けるとはどういうことでしょうか?
スレッドとは何ですか?


 普通にスレッドというと、「糸」「(話の)筋道」です。メーリングリストで「スレッド」というと「返信でつなげたメール」になります。とにかく、「つながったもの」を指します。
 コンピュータのアプリケーションでは、「処理の流れ」になります。「スレッドを分ける」とは、「マルチスレッドにする」ということです。「マルチスレッド」とは、1つのプロセスで、複数の「処理の流れ」を作ることです。OSが、そのプロセスのために割り当てた時間を、実行されているスレッドすべてに均等(でもないが)に再分配して実行します。
 なぜマルチスレッドにするかというと、1つのスレッドで時間のかかる処理を行い、もう一つのスレッドで人間の相手をさせます。人間は、アプリケーションが自分の相手をしてくれるので、待ちストレスを感じにくくなります。この場合はメインとなるスレッドは「時間のかかる処理」を行うスレッドを起動した後、それが終わるまではWindowsメッセージを処理する状態に戻り(人間の相手をする)、作られたスレッドは「時間のかかる処理」を行います。

 VB.NETでマルチスレッドにするのは簡単で、スレッドの開始点を示してスレッドオブジェクトを作り、開始させます。

Public Sub ThreadProc()
' スレッドの開始点
End Sub

Public Sub Hoge()
' スレッドオブジェクトを作って
Dim t As Thread = New Thread(New ThreadStart(AddressOf Me.ThreadProc))
' 開始する
t.Start()
End Sub


 スレッドを使う上で問題がいくつかありまして、同じメモリイメージ内で複数の処理が動作するので、グローバルな変数の扱いには気をつけなければなりません。また、子スレッドからフォームの内容を変更する場合は、かならずInvokeを使用して、親スレッドに同調しなければなりません(親スレッドにさせているみたい)。

 プログラムをマルチスレッドにするのは簡単ですが、マルチスレッドなプログラムを設計するには細心の注意が必要です。安易に手を出していい領域ではありません。それなりの知識が必要です。
1

スキルアップ/キャリアアップ(JOB@IT)