![]()
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);
}
}