- - PR -
マルチスレッドでのフォームの更新処理
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 2005-03-14 14:13
色々とやった結果、なんとかデッドロックが発生せず(?)に処理を行えました。
力技ですが、以下のようにしました。 1.フォームスレッドにフラグを設定する 2.Wokerスレッドは、フォームを更新する(Invoke)ときにフラグをTrueにし、 フォームの更新が完了したらフラグをFalseにする 3.フォームスレッドでボタンを押したときに、フラグの状態を確認する 4.フラグがTrueなら、Application.DoEvensでフォームスレッドのイベントを処理する 5.フラグがFalseになったら、ボタンを押したときに処理を行う これでデッドロックでフリーズすることもなくなり、 ボタンを押してすぐにボタンを向こうにすることも出来ました。 これが最善かはわかりませんが、とりあえずこの方法でいってみます。 色々とアドバイスをありがとうございました。 ================================================================================ Public invokeFlg As Boolean 'Invoke実行フラグ Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click ボタンを無効にする Do while invokeFlg = True Application.DoEvents() Sleep(100) Loop TextBoxの内容を更新する End Sub '5秒毎にTextBox1を更新する Public Sub UpdateText() threadRunning = True 'スレッド実行フラグをTrueに設定 Do formThread.invokeFlg = true 'Invokeでフォームを変更することを通知 Invokeでテキストボックスを更新する formThread.invokeFlg = false 'Invokeの完了を通知 System.Threading.Thread.Sleep(5 * 1000) Loop Until threadStop = True End Sub ================================================================================ |
|
投稿日時: 2005-03-14 19:38
Button2_Clickでスレッドを一時停止したりとか操作するんじゃなかった?
その場合、いろいろとやらないとだめだと思うんだけど。 ま、動いてるならそれでいいか。 |
