今回は、VB.NETのSleepで指定した時間だけ処理を止める方法についてご紹介します。
Sleepメソッドとは
VB.NETでスレッドを一定時間停止させる方法として、System.Threading.Thread.Sleepがよく利用されます。
引数にはミリ秒単位の数値を指定し、その間だけ現在のスレッドの処理を一時停止します。
たとえば、Thread.Sleep(1000)であれば約1秒間スレッドが停止します。
Sleepメソッドの基本的な使い方
ここでは、コンソールアプリケーションでの基本的な使い方を確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Imports System.Threading Module Module1 Sub Main() Console.WriteLine("処理開始") ' 1秒間停止 Thread.Sleep(1000) Console.WriteLine("1秒経過") ' さらに2秒間停止 Thread.Sleep(2000) Console.WriteLine("2秒経過し、処理終了") End Sub End Module |
処理開始
1秒経過
2秒経過し、処理終了
このように、処理の途中でThread.Sleepを呼び出すことで、意図的にプログラムの実行を遅らせることができます。
ただしメインスレッドが停止するため、その間にUIがある場合は応答がなくなる点に注意が必要です。
実用的な具体例
Windows Formsでの利用例
Windows Formsなどのユーザーインターフェース(UI)があるアプリケーションでThread.Sleepを使うと、UIスレッドが停止します。
以下の例では、ボタンをクリックするとUIが1秒間フリーズし、Labelにメッセージを表示します。
1 2 3 4 5 6 7 8 9 10 |
Imports System.Threading Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Label1.Text = "処理中..." ' 1秒間スレッドが停止するため、この間UIはフリーズする Thread.Sleep(1000) Label1.Text = "1秒経過" End Sub End Class |
処理中…
(1秒間のUIフリーズ)
1秒経過
UIフリーズを回避する例
重い処理や待機処理は、別スレッドで実行することでUIが固まるのを防げます。
以下は、新規のスレッドで待機処理を行った後、Invokeを使ってLabelを更新する例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Imports System.Threading Public Class Form1 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click ' 新しいスレッドを作成して、待機処理を行う Dim t As New Thread(AddressOf LongProcess) t.Start() End Sub Private Sub LongProcess() ' ここで1秒待機 Thread.Sleep(1000) ' Invokeを使ってLabelを更新(UIスレッドで実行する) Me.Invoke(Sub() Label2.Text = "別スレッドで1秒待機後の処理" End Sub) End Sub End Class |
別スレッドで1秒待機後の処理
この例では、別スレッドで待機するため、UIのフリーズを回避しながらスレッドの停止を実装できます。
Sleepメソッドを使う際の注意点
主に以下の点を意識して利用すると、思わぬトラブルを防げます。
- UIスレッドのフリーズ: メインスレッドでSleepを実行すると、UI操作を受け付けなくなります。
- 停止時間の誤差: 指定した時間はあくまで最短停止時間の目安であり、システム負荷によって多少の誤差が発生する可能性があります。
- デバッグ時の効率低下: 長いSleepはデバッグ効率を下げることがあります。
- 非同期プログラミングの利用検討: 特にGUIアプリケーションでは、Async/AwaitやTask.Delayの利用も選択肢に入ります。
まとめ
VB.NETでThread.Sleepを使うと、指定したミリ秒だけスレッドの処理を止めることができます。
ただしUIを含むメインスレッドでの実行は、フリーズの原因となるため避けることが推奨されます。
用途によっては別スレッドや非同期手法を活用しながら適切に実装することが大切です。