VBでセマフォをつかえますか?


初心者  2005-01-22 20:34:50  No: 119133

VBでのセマフォの使い方がまったくわかりません。
よろしくおねがいします。


魔界の仮面弁士  2005-01-22 23:21:47  No: 119134

セマフォは……あれ、見つかりませんね。あるのかな。
もしかしたら、直接 CreateSemaphore API を呼ばないと駄目かも。

質問の意図が見えないので、具体的な回答はできかねますが、同期制御の
仕方を知りたいという意図であれば、『SyncLock ステートメント』や、
WaitHandleの派生クラス(Mutexクラスなど)あたりが、おそらく使えるかと。


初心者  2005-01-23 04:54:31  No: 119135

OpenSemaphore,WaitForSingleObjectとかつかいたいんですけど、
宣言の仕方とか記述法とかまったくわからないです。


foo  2005-01-23 08:11:54  No: 119136

環境を書いていないので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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加