231上位机VC MFC使用信号量使多线程同步
功能展示 当前使用使用信号量的方法使多个线程顺序向编辑框写入文本,实现多个线程间的同步功能,效果如图,点击按钮,三个线程按照先后顺序向编辑框写入字符; 要点提示 1.信号量的变量的创建可以用函数 CreateSemaphore() 函数原型:HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTESlpSemaphoreAttributes, LONGlInitialCount, LONGlMaximumCount, LPCTSTRlpName); lpSemaphoreAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As Long,并传递零值)——表示采用不允许继承的默认描述符。该参数定义了信号量的安全特性 lInitialCount Long,设置信号量的初始计数。可设置零到lMaximumCount之间的一个值 lMaximumCount Long,设置信号量的最大计数 lpName String,指定信号量对象的名称。用vbNullString可创建一个未命名的信号量对象。如果已经存在拥有这个名字的一个信号量,就直接打开现成的信号量。这个名字可能不与一个现有的互斥体、事件、可等待计时器或文件映射的名称相符 2.一旦不再需要,一定记住用CloseHandle关闭信号量的句柄。它的所有句柄都关闭以后,对象自己也会删除 一旦值大于零,信号量就会触发(发出信号)。ReleaseSemaphore函数的作用是增加信号量的计数。如果成功,就调用信号量上的一个等待函数来减少它的计数 实现功能 1.新建基于对话框的应用程序 2.拖拽一编程框ID为IDC_EDIT1,拖拽一按钮关联函数 - void CGkbc8Dlg::OnButton1()
- {
- g_hSema=CreateSemaphore(NULL,1,1,NULL);//初始化信号量
- CEdit*pEdit=(CEdit*)GetDlgItem(IDC_EDIT1);
- pEdit->SetWindowText("使用信号量实现多线程同步:\r\n\r\n");
- AfxBeginThread(ThreadFun1,pEdit);
- AfxBeginThread(ThreadFun2,pEdit);
- AfxBeginThread(ThreadFun3,pEdit);
- }
复制代码3.在此函数前添加信号量变量及三个线程函数 - HANDLE g_hSema;
- static UINT ThreadFun1(LPVOID pParam)
- {
- WaitForSingleObject(g_hSema,INFINITE);
- CEdit*pEdit=(CEdit*)pParam;
- CString sText;
- for(int i=0;i<25;i++)
- {
- pEdit->GetWindowText(sText);
- sText+="信";
- pEdit->SetWindowText(sText);
- Sleep(50);
- }
- pEdit->GetWindowText(sText);
- sText+="\r\n\r\n";
- pEdit->SetWindowText(sText);
- ReleaseSemaphore(g_hSema,1,NULL);
- return 0;
- }
复制代码- static UINT ThreadFun2(LPVOID pParam)
- {
- WaitForSingleObject(g_hSema,INFINITE);
- CEdit*pEdit=(CEdit*)pParam;
- CString sText;
- for(int i=0;i<25;i++)
- {
- pEdit->GetWindowText(sText);
- sText+="号";
- pEdit->SetWindowText(sText);
- Sleep(50);
- }
- pEdit->GetWindowText(sText);
- sText+="\r\n\r\n";
- pEdit->SetWindowText(sText);
- ReleaseSemaphore(g_hSema,1,NULL);
- return 0;
- }
- static UINT ThreadFun3(LPVOID pParam)
- {
- WaitForSingleObject(g_hSema,INFINITE);
- CEdit*pEdit=(CEdit*)pParam;
- CString sText;
- for(int i=0;i<25;i++)
- {
- pEdit->GetWindowText(sText);
- sText+="量";
- pEdit->SetWindowText(sText);
- Sleep(50);
- }
- pEdit->GetWindowText(sText);
- sText+="\r\n\r\n";
- pEdit->SetWindowText(sText);
- ReleaseSemaphore(g_hSema,1,NULL);
- return 0;
- }
复制代码在程序退出时关闭全局的信号变量 void CGkbc8Dlg::OnDestroy() { CDialog::OnDestroy(); CloseHandle(g_hSema); } 我们来演示下功能实现的整个过程
|