![]()
HANDLE mutex;
void C界面线程Dlg::OnCancel()
{
// TODO: 在此添加专用代码和/或调用基类
DeleteCriticalSection(&lpCriticalSection);
CloseHandle(mutex);
CDialog::OnCancel();
}
UINT __cdecl ThreadProc3( LPVOID pParam ){//UINT = 无符号的int类型,4个字节,看平台决定
C界面线程Dlg* t = (C界面线程Dlg*)pParam;//强制类型转换
int i=0;
while(i<50){
//INFINITE表示永久等待,WaitForSingleObject这个方法表示等到内核对象为受信状态
DWORD ret = WaitForSingleObject(mutex,INFINITE);//永久等待,Sing表示等待单个,也有muilte多个的,相当于进入屋子,然后加一把锁
if(ret == WAIT_ABANDONED || ret == WAIT_OBJECT_0){//WAIT_ABANDONED为异常,WAIT_OBJECT_0为正常等待成功
ccc++;
i++;
Sleep(1);
CString str;
str.Format("%d\r\n",ccc);
t->myedit1+=str;
ReleaseMutex(mutex);//相当于从屋子里面走出去,相当于把无信号变成有信号,让下一个线程得到信号
}
::SendMessage(t->GetSafeHwnd(), WM_MyMessage, 0,0);//发送了,如果 想在不是主线程的线程中操作窗口的话,就用发送消息
}
return 0;
}
void C界面线程Dlg::OnBnClickedButton9()
{
mutex = ::CreateMutex(NULL,FALSE,NULL);//安全,属于哪个线程,名字,因为我们不需要打开这个互斥体,所以名字为NULL
this->myedit1="";
ccc = 0;
for(int i=0;i<20;i++){
AfxBeginThread(ThreadProc3,this);
}
}