- PR -

CreateSemaphoreの使い方を教えてください

1
投稿者投稿内容
pino
会議室デビュー日: 2004/07/22
投稿数: 2
投稿日時: 2004-07-22 22:58
プロセスの同期を取るため、セマフォを使っているのですが
WaitForSingleObjectで制御が戻って来ないで、止まってしまいます。
どなたか、vb.netでセマフォを使ったことがある方ご教授下さい。


Public Declare Auto Function WaitForSingleObject Lib "kernel32.dll" _
(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Public Declare Auto Function CreateSemaphore Lib "Kernel32.dll"      Alias "CreateSemaphoreA" _
(ByVal lAtt As Long, ByVal lInitCount As Long, ByVal lMaxCount As Long, ByVal lpName As String) As Long

Dim m_lhandle As Long

m_lhandle = CreateSemaphore(Nothing, 1, 1, "SEMAPHORE_NAME")

'もし待機中なら制御が戻るまで待つ
If Nothing <> m_lhandle Then
 'WaitForSingleObject(m_lhandle, INFINITE) '&HFFFFはだめでした。
WaitForSingleObject(m_lhandle, 0) '0でもだめでした。
end if

全く同じプログラムで、VC6.0では正常に動作しました。
開発環境は vb.net 2003 OSはXPです。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-07-22 23:05
引用:

pinoさんの書き込み (2004-07-22 22:58) より:
Public Declare Auto Function WaitForSingleObject Lib "kernel32.dll" _
(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Public Declare Auto Function CreateSemaphore Lib "Kernel32.dll"      Alias "CreateSemaphoreA" _
(ByVal lAtt As Long, ByVal lInitCount As Long, ByVal lMaxCount As Long, ByVal lpName As String) As Long


WaitHandle派生クラスを作った方が良さげってのはおいとくとして…

とりあえず、LongのところをIntegerに変えてみてください。
あ、ハンドルのところはIntPtrの方がいいかな。
pino
会議室デビュー日: 2004/07/22
投稿数: 2
投稿日時: 2004-07-22 23:37
>>とりあえず、LongのところをIntegerに変えてみてください。
>>あ、ハンドルのところはIntPtrの方がいいかな。

ご教授ありがとうございます!
うまくいきました。
これで今日は眠れます。結構ずっぽりはまっていたのでかなりうれしいです。

>>WaitHandle派生クラスを作った方が良さげってのはおいとくとして…

調べてみます。アドバイスまでいただいて、感謝です。m(__)m
1

スキルアップ/キャリアアップ(JOB@IT)