- PR -

マルチスレッドでのフォームの更新処理

投稿者投稿内容
たけ
常連さん
会議室デビュー日: 2004/02/23
投稿数: 42
お住まい・勤務地: 神奈川県/東京都
投稿日時: 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/12
投稿数: 148
投稿日時: 2005-03-14 19:38
Button2_Clickでスレッドを一時停止したりとか操作するんじゃなかった?
その場合、いろいろとやらないとだめだと思うんだけど。
ま、動いてるならそれでいいか。

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