| 分類:[VB.NET/VB2005]
お尋ねします。 メインフォームForm1から別スレッドで経過表示用フォームForm2をShowDialog表示する下記のコードで、 書き込み処理中にForm2のクローズボックスをクリックすると、Invokeのところで凍りついてしまいます。 どこに問題があるのでしょうか。 開発環境・使用言語はVB2003/Framework1.1です。
'/*** Form1 (メインフォーム) ***/ Public Class Form1 : Inherits System.Windows.Forms.Form '// Friend WithEvents Button1 As System.Windows.Forms.Button '// Friend WithEvents Button2 As System.Windows.Forms.Button Private fm2 As Form2
'// Button1.Click : Form2を別スレッドで開く Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If fm2 Is Nothing Then Dim t As New System.Threading.Thread(AddressOf Me.ShowForm2) t.Start() End If End Sub
'// Form2を開くためのプロシージャ Private Sub ShowForm2() fm2 = New Form2 fm2.ShowDialog() fm2.Dispose() fm2 = Nothing End Sub
'// Button2.Click : 経過記録を表示しながら行う繰り返し処理 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Me.Button2.Enabled = False For i As Integer = 1 To 1000 Me.WriteLine(i.ToString() & "巡目です。") Next Me.Button2.Enabled = True End Sub
'// Form2に1行表示 Private Sub WriteLine(ByVal text As String) If fm2 Is Nothing Then Return Try fm2.WriteLine(text) Catch ex As System.ObjectDisposedException End Try End Sub End Class
'/*** Form2 (経過表示用フォーム) ***/ Public Class Form2 : Inherits System.Windows.Forms.Form '// Friend WithEvents RichTextBox1 As System.Windows.Forms.RichTextBox Private Delegate Sub WriteLineDelegate(ByVal text As String) Private dlgt As New WriteLineDelegate(AddressOf Me.WriteLine)
'// リッチテキストボックスに文字を追記表示する Public Sub WriteLine(ByVal text As String) If Me.IsDisposed OrElse Not Me.IsHandleCreated Then Return If Me.InvokeRequired Then Me.Invoke(dlgt, New Object() {text}) '// ここで凍りつく Else With Me.RichTextBox1 .AppendText(text & vbCrLf) .ScrollToCaret() .Focus() End With End If End Sub End Class
なお、Form1.ShowForm2の fm2.Dispose() : fm2 = Nothing を外しても状況は変わりませんでした。 |