VB.NET覚書

VB.NETの覚書
[個人メモ] [仕事メモ] [アイデア] [Ruby]
[TIPS] [対応表] [コメント書き方] [.NET Tips] [VB中学校] [VB.NET の入門サイト] [VB.NET コーディング標準 ] [VBレスキュー] [NonSoft]

2016-04-26

DELEGATE

http://dobon.net/vb/dotnet/process/sleep.html

関数ポインタみたいなもの

Public Class Form1
    Property IsNowProcessing As Boolean = False

    Private Delegate Sub Delegate_重たい処理()

    Private Sub 重たい処理()
        '重たい処理をズラズラと
        '一秒間(1000ミリ秒)停止する
        System.Threading.Thread.Sleep(1000)
    End Sub

    Private Sub CompleteProcess()
        IsNowProcessing = False
    End Sub
    Private Sub BeginWordAppPrintOut()

        If Not IsNowProcessing Then

            IsNowProcessing = True



            Dim d As New Delegate_重たい処理(AddressOf 重たい処理)

            d.BeginInvoke(AddressOf CompleteProcess, d)

        Else

            MsgBox("別の処理をしている可能性があります。", MsgBoxStyle.Information, "")

            Exit Sub

        End If

    End Sub

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        BeginWordAppPrintOut()
    End Sub
End Class

http://d.hatena.ne.jp/akiramei/20060123/p1

注意

上記を見ての通り、大量にBeginInvokeを行うとTimers.Elapsedが影響を受けます。実はBeginInvokeもElapsedもスレッドプール使用していて、デフォルトで1CPU、1プロセスあたり25スレッドという制限があるためです。なので、BeginInvokeには時間の掛かる処理は行わせるべきではありません。ちなみにコメントアウトしているThreadを使った処理の場合は、スレッドプールを使わないので時は止まりません。(^^;

トラックバック - http://sub.g.hatena.ne.jp/garyo/20160426