VBでのセマフォの使い方がまったくわかりません。
よろしくおねがいします。
セマフォは……あれ、見つかりませんね。あるのかな。
もしかしたら、直接 CreateSemaphore API を呼ばないと駄目かも。
質問の意図が見えないので、具体的な回答はできかねますが、同期制御の
仕方を知りたいという意図であれば、『SyncLock ステートメント』や、
WaitHandleの派生クラス(Mutexクラスなど)あたりが、おそらく使えるかと。
OpenSemaphore,WaitForSingleObjectとかつかいたいんですけど、
宣言の仕方とか記述法とかまったくわからないです。
環境を書いていないのでVB6だと仮定して簡単なサンプル。
同時起動個数を3つに限定します。複数起動させたくないなら数字を適切に変えればOK.
同期処理なら応用してください。
.netならこれに載っているAPI名で調べてみてください。
Option Explicit
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Private Declare Function OpenSemaphore Lib "kernel32" Alias "OpenSemaphoreA" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal lpName As String) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function ReleaseSemaphore Lib "kernel32" (ByVal hSemaphore As Long, ByVal lReleaseCount As Long, lpPreviousCount As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function CreateSemaphore Lib "kernel32" Alias "CreateSemaphoreA" (lpSemaphoreAttributes As SECURITY_ATTRIBUTES, ByVal lInitialCount As Long, ByVal lMaximumCount As Long, ByVal lpName As String) As Long
Dim hSemaphore As Long
Private Sub Form_Load()
Dim result As Long
Dim d As SECURITY_ATTRIBUTES
Dim SEMAPHORE_NAME As String
SEMAPHORE_NAME = "セマフォの名前"
' セマフォオブジェクトの作成/取得
hSemaphore = CreateSemaphore(d, 3, 3, SEMAPHORE_NAME)
result = WaitForSingleObject(hSemaphore, 0)
' すでに3つ開いているかどうか判定
If result <> 0 Then
MsgBox ("既に3つ開いている")
Call CloseHandle(hSemaphore)
Unload Me
End If
End Sub
Private Sub Form_Terminate()
' 解放
Call ReleaseSemaphore(hSemaphore, 1, 0)
Call CloseHandle(hSemaphore)
End Sub
ツイート | ![]() |