MFC线程同步_CreateSemaphore信号量

 

 

UINT __cdecl ThreadProc4( LPVOID pParam ){//UINT = 无符号的int类型,4个字节,看平台决定
    
    C界面线程Dlg* t = (C界面线程Dlg*)pParam;//强制类型转换
    while(true){
        CString str;
            DWORD ret =  WaitForSingleObject(semaphoreh,0);//获取信号量,超时为0 ,表示不等待,  如果调用成功的话,信号量会减1
                if(ret == WAIT_ABANDONED || ret == WAIT_OBJECT_0){//WAIT_ABANDONED为异常,WAIT_OBJECT_0为正常等待成功,信号量会减1
                        str.Format("已等到...%d\r\n",GetCurrentThreadId());//说明已经成功等到
                        t->myedit1+=str;
                        ::SendMessage(t->GetSafeHwnd(), WM_MyMessage, 0,0);//发送了,如果 想在不是主线程的线程中操作窗口的话,就用发送消息
                        Sleep(5000);
                        ReleaseSemaphore(semaphoreh,1,NULL);//用完后要把信号量加1,最后一个参数为加1前的有多少个信号量
                }else{//WAIT_TIMEOUT
                    //说明未等到
                Sleep(1000);
                str.Format("未等到...%d\r\n",GetCurrentThreadId());
                t->myedit1+=str;
                ::SendMessage(t->GetSafeHwnd(), WM_MyMessage, 0,0);//发送了,如果 想在不是主线程的线程中操作窗口的话,就用发送消息
                }
                
    }
    return 0;
}

void C界面线程Dlg::OnBnClickedButton10()
{
//HANDLE WINAPI CreateSemaphore(
//  __in          LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,//安全级别
//  __in          LONG lInitialCount,//刚开始可以取多少个信号
//  __in          LONG lMaximumCount,//一共有多少个信号
//  __in          LPCTSTR lpName//名字
//);

    semaphoreh = CreateSemaphore(NULL,2,2,NULL);//因为只在我们这个线程使用,所以就不需要名字,

    this->myedit1="";
    ccc = 0;
        for(int i=0;i<4;i++){
    AfxBeginThread(ThreadProc4,this);
    }
}

通过CreateSemaphore 创建信号量来控制线程的访问数


因为他是内核对象,所以必要挂
已等到...6536
已等到...8496
未等到...12652
未等到...12628
未等到...12652
未等到...12628
未等到...12652
未等到...12628
未等到...12652
未等到...12628
未等到...12652
未等到...12628
已等到...6536
已等到...8496
未等到...12652
未等到...12628
未等到...12652
我们可以看到,5秒内访问的线程数只能有2个...

posted @ 2013-08-03 21:05  宝贝,我永远都在  阅读(1942)  评论(0)    收藏  举报