Back to Top

プログラムの覚書

VB.NETマルチスレッドの排他制御

マルチスレッドでの排他制御の説明

以下のサンプルはスレッド1スレッド2よりsに文字を追加するぷろぐらむです。

排他制御はSyncLock~End SyncLockの間になります。

この行をコメントで外すと、まともに追加されません。

Private thread1 As System.Threading.Thread
Private thread2 As System.Threading.Thread

Private thisLock As New Object
Private s As String = ""

Private Sub ThreadMain1()
    Dim i As Integer
    For i = 0 To 9999
        SyncLock thisLock
            s = s + "A"
        End SyncLock
    Next
    System.Diagnostics.Debug.WriteLine(" Thread1:" & s.Length.ToString())
End Sub

Private Sub ThreadMain2()
    Dim i As Integer
    For i = 0 To 9999
        SyncLock thisLock
            s = s + "B"
        End SyncLock
    Next
    System.Diagnostics.Debug.WriteLine(" Thread2:" & s.Length.ToString())
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    thread1 = New System.Threading.Thread(AddressOf ThreadMain1)
    thread2 = New System.Threading.Thread(AddressOf ThreadMain2)
    thread1.Start()
    thread2.Start()
End Sub

・SyncLockはSystem.Monitorの省略型で、System.Monitorして排他もできます。

・SyncLock はSyncLock Meと自分自身のオブジェクトを指定できます。が注意が必要です。

 

VB.NET別フォーム

プログラム中でインスタンスを生成して、フォームを操作する

フォームを表示する

Dim fm2 As New Form2()
fm2.Show()

モーダルで表示する

Using fm2 As New Form2()
    fm2.ShowDialog()
End Using

フォームの表示位置を設定する

フォームの初期位置は、FormStartPosition列挙体で指定します。

'親フォームの中央に表示されます
fm2.StartPosition = FormStartPosition.CenterParent

フォームをアクティブにする

fm2.Activate()

フォームを隠す

fm2.Hide()

フォームを閉じる

fm2.Close()

フォームを[OK]または[Cansel]で終了する

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    'OK終了
    Me.DialogResult = DialogResult.OK

    または

    'Cancel終了
    Me.DialogResult = DialogResult.Cancel
End Sub
'呼び出し側
Using fm As New Form2()
    If (fm.ShowDialog = DialogResult.OK) Then
        MessageBox.Show("OKボタンが押されました。")
    End If
End Using

フォームが閉じられるのをキャンセルする

Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
    If MessageBox.Show("閉じますか?", "確認", MessageBoxButtons.YesNo) = DialogResult.No Then
        e.Cancel = True
    End If
End Sub