NonSoft

画面が固まらないスリープのサンプル
(C#/VB.NET/VB6)


 サンプル(ソース/コード)
<このサンプルの概要>
スリープ用のAPI(Sleep)をそのまま呼び出すと、画面が固まってしまいます。
それを解決する方法は、Sleepの合間にDoEventsを入れる事です。

※プログラミング用語のスリープとは、指定した時間(ミリ秒)処理を停止する事です。

通常は、Sleepを使わずTimerコントロールで状態遷移制御すべきかもしれません。
しかし、Sleepでタイミングを計る方がプログラムが分かりやすくなる事が多いです。

DoEventsは処理時間が不正確なので、ハードウェア制御等で正確(高精度)な時間待ちを
必要とする場合は使用しない方が良いです。Timerコントロールも処理時間的に不正確です。


VB.NET(C#も同じ)のスリープ(Sleep)は次のように記述します。
(この記述はAPIを使用しない、.NETのネイティブな記述方法です)
System.Threading.Thread.Sleep(100)

VB.NETでスリープ用のAPI(Sleep)を使う場合は次のように記述します。
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Integer)

C#.NETでスリープ用のAPI(Sleep)を使う場合は次のように記述します。
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
extern static void Sleep(int dwMilliseconds);

VB.NET(C#も同じ)でDoEventsは次のように記述します。
System.Windows.Forms.Application.DoEvents()


ちなみに、、、
VBSのスリープ(Sleep)は次のように記述します。
WScript.Sleep(1000)
VBSのDoEventsは必要ありません(サポートされていません)。

' スリープ用のAPI---------------------------------------------------------------
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
'
' VB.NETでスリープAPIを使用する場合(例1)
' Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Integer)
'
' VB.NETでスリープAPIを使用する場合(例2)
' <DllImport("kernel32.dll")> _
' Private Shared Sub Sleep(ByVal dwMilliseconds As Integer)
' End Sub
'
' C#.NETでスリープAPIを使用する場合
' [System.Runtime.InteropServices.DllImport("kernel32.dll")]
' extern static void Sleep(int dwMilliseconds);
' ------------------------------------------------------------------------------

' 関数名    : SleepDoEvents
' 返り値    : 無し
' 引き数    : mSec(i) : スリープ時間(ミリ秒)
' 機能説明  : 画面が固まらないスリープ
Public Sub SleepDoEvents(ByVal mSec As Long)
    Dim i As Long
    For i = 0 To mSec - 1 Step 100
        Sleep 100    ' .NETではSystem.Threading.Thread.Sleep(100)
        DoEvents     ' .NETではSystem.Windows.Forms.Application.DoEvents()
    Next i
End Sub