多线程

http://hi.baidu.com/ruiqing_2008/item/62df6227185f91d4a517b607

http://hi.baidu.com/girlkoo/item/785e47c7bc162f7088ad9e40
http://hi.baidu.com/vc_net/item/e8871cb808da3fa5ebba935e

http://www.cnblogs.com/goalone1985/articles/2125070.html

同步问题 Semaphore的使用

http://tech.ccidnet.com/art/1077/20051206/820675_1.html

请先看 "同步问题 Event的使用" 与 "同步问题 Mutex的使用"
Semaphore是另一个同步问题机制,不论是Event或Mutex,其他Process在执WaitForSingleObject
时,就看当时的物件是Signal或UnSignal而决定是否等待,而Semaphore也相同,但是它
要变成Signal /UnSignal的状态,却有些不同,它是提供一个计数值,它允许在这个计数
值之内,任何执行到WaitForSingleObject的Thread都不会停下来,而且每执行
WaitForSingleObject一次,计数值就减一,当计数值变成0时,该Semaphore才会处於
UnSignal的状态,而某个Thread ReleaseSemaphore时,便会将计数值增加,以便其他的
Thread或本身可得Signal的讯号,而使WaitForSingleObject停止等待。

例如说,该电脑只有两个 COM PORT,所以只允许两个计数值同时使用COM PORT,因此,

    hSema = CreateSemaphore(ByVal 0&, 2, 2, "MySema")

第2个叁数表示:刚开始的时候,有多少个COM PORT可使用
第3个叁数表示:最多有多少个COM PORT可使用
第4个叁数:Semaphore的名称,只要名称相同,则传回的handle(hSema)会指向相同的
  Semaphore物件。因此,要使用相同的名称来Create Semaphore才能达共用
  一个Semaphore的效果。
而使用WaitForSingleObject来Check看看是否还有剩下的COM Port可使用,如果还有剩
(计数值 > 0),则没有等待而可执行下一行指令,同时,计数值减1。若有第三个要求
COM PORT的使用,那它就得等待,直到有Thread执行

    ReleaseSemaphore(hSema, 1, count)

第2个叁数表示:Release多少个COM PORT出来,一般来说都是1,表示一个ReleaseSemaphore
       会将计数器的值加一,但是您也可以指定 > 1的值,代表一口气增加计数器
       的值( + n , n > 1)。例如,您的程式一口气使用了两个COM PORT,并假设
       您於程式中有使用WaitForSingleObject两次,程式最後,使用
       ReleaseSemaphore(hSema, 2, count)而不必
       ReleaseSemaphore(hSema, 1, count)执行两次。
第3个叁数表示:ReleaseSemaphore执行之前计数器原来的值。

Semaphore和Event有个地方相同,那就是没有Owner的观念,即Thread A 所Create出的
Semaphore物件,於Thread B中执行ReleaseSemaphore时,依然会增加计数器的值

'以下程式需两个Command BUTTON 一个ListBox,并产生两个执行个体来做
Private Const INFINITE = &HFFFF
Private Declare Function CreateSemaphore Lib "kernel32" Alias "CreateSemaphoreA" (lpSemaphoreAttributes As Any, ByVal lInitialCount As Long, ByVal lMaximumCount As Long, ByVal lpName As String) As Long ' modified by KJ
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 ReleaseSemaphore Lib "kernel32" (ByVal hSemaphore As Long, ByVal lReleaseCount As Long, lpPreviousCount As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private hSema As Long
Private Sub Command1_Click()
    Call WaitForSingleObject(hSema, INFINITE) '一直等到有可用的COM PORT才结束
    List1.AddItem "可用COM PORT 减一"
    List1.ListIndex = List1.NewIndex
    '在此处理Com Port的程式
End Sub

Private Sub Command2_Click()
    Dim count As Long
    '在此处理com port Close的动作
    If ReleaseSemaphore(hSema, 1, count) Then
List1.AddItem "剩下可用COM PORT等於:" & count + 1
    Else
List1.AddItem "Semaphore Release 无效"
    End If
    List1.ListIndex = List1.NewIndex
End Sub

Private Sub Form_Load()
    hSema = CreateSemaphore(ByVal 0&, 2, 2, "MySema")
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Call CloseHandle(hSema)
End Sub

http://hi.baidu.com/girlkoo/item/785e47c7bc162f7088ad9e40


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值