MFC线程同步_CreateEvent

 

 

HANDLE evetnHandle;
UINT __cdecl ThreadProc5( LPVOID pParam ){//UINT = 无符号的int类型,4个字节,看平台决定
    C界面线程Dlg* t = (C界面线程Dlg*)pParam;//强制类型转换
    while(true){
        CString str;
            DWORD ret =  WaitForSingleObject(evetnHandle,0);//等待这个内核对象,一直等待,如果等到的话,他不会设置成非受信状态,因为我们刚刚设置过了

                if(ret == WAIT_ABANDONED || ret == WAIT_OBJECT_0){//WAIT_ABANDONED为异常,WAIT_OBJECT_0为正常等待成功,信号量会减1
                        //把他设置为  :非受信状态
                        ResetEvent(evetnHandle);//意思就是其他的线程会获取不到我这个内核对象
                        str.Format("已等到...%d\r\n",GetCurrentThreadId());//说明已经成功等到
                        t->myedit1+=str;
                        ::SendMessage(t->GetSafeHwnd(), WM_MyMessage, 0,0);//发送了,如果 想在不是主线程的线程中操作窗口的话,就用发送消息
                        Sleep(5000);
                        //处理完毕我们的事情后,必须把房间给让出来
                        SetEvent(evetnHandle);//把evetn内核对象设置为受,意思就是其他线程可以访问了

                }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::OnBnClickedButton11()
{
            //CreateEvent( 
         //   NULL,     // no security attributes
         //   FALSE,    // auto-reset event, 这个如果为TRUE的话,在调用waitSingObject函数的时候,他不会自动把你的内核对象设置为非受信状态
         //   TRUE,     // initial state is signaled//意思是这个状态,为TRUE表示为设置为激活状态,也就是受信状态
         //   NULL);    // object not named//这个evetn没有名字
    evetnHandle = CreateEvent(NULL,TRUE,TRUE,NULL);//为TRUE,表示状态由我们设置

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

 

 

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