|
Imports System.Threading
Public Class Form1
' スレッドの終了をコントロールするフラグ
Private stopFlg As Integer = 0
' ************************************************************
' ロード前の初期処理 (1)
' ************************************************************
Sub New()
' この呼び出しは、Windows フォーム デザイナで必要です。
InitializeComponent()
End Sub
' ************************************************************
' コントロール作成時
' ************************************************************
Protected Overrides Sub OnCreateControl()
' (2)
' この処理を実行中に、Load イベントが発生します
MyBase.OnCreateControl()
' (4)
End Sub
' ************************************************************
' 初期処理 (3)
' ************************************************************
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
' スレッド処理するメソッドを作成
Dim ThreadProc As New Thread(AddressOf ThreadEntry)
' スレッド開始
ThreadProc.Start()
End Sub
' ************************************************************
' フォーム表示後の初期処理 (5)
' ************************************************************
Private Sub Form1_Shown(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Shown
End Sub
' ************************************************************
' スレッドの入り口
' ************************************************************
Private Sub ThreadEntry()
Dim Bridge As New ProcBridge(AddressOf SetData)
' 参照する為に、常に 0 で比較後等しければ 0 をセット。1 の時にループ終了
Do While Interlocked.CompareExchange(stopFlg, 0, 0) = 0
Thread.Sleep(1000)
Console.WriteLine(Now)
Me.Invoke(Bridge, New Object() {1, Now.ToString()})
Loop
' 実際の終了を通知する
Me.Invoke(Bridge, New Object() {-1, "終了処理中です..."})
End Sub
' ************************************************************
' 橋渡し用デリゲート
' ************************************************************
Delegate Sub ProcBridge(ByVal type As Integer, ByVal str As String)
' ************************************************************
' 橋渡し用実体
' ************************************************************
Private Sub SetData(ByVal type As Integer, ByVal str As String)
If type = 1 Then
Me.TextBox1.Text = str
End If
If type = -1 Then
Me.TextBox2.Text = str
' 強制描画
Me.TextBox2.Update()
Thread.Sleep(1000)
' 終了通知うけて、実際終了する
' ( FormClosing と FormClosed が発生する )
Application.Exit()
End If
End Sub
' ************************************************************
' フォームが閉じる前( e.Cancel = True でキャンセル可能 )
' ************************************************************
Private Sub Form1_FormClosing(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.FormClosingEventArgs) _
Handles MyBase.FormClosing
' スレッド実行中ならば、スレッドが終了する状態にして、終了処理をキャンセル
If Interlocked.CompareExchange(stopFlg, 0, 0) = 0 Then
Interlocked.Exchange(stopFlg, 1)
e.Cancel = True
End If
End Sub
' ************************************************************
' フォームが閉じた後
' ************************************************************
Private Sub Form1_FormClosed(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.FormClosedEventArgs) _
Handles MyBase.FormClosed
End Sub
End Class
| |