工控编程吧
标题:
231上位机VC MFC使用信号量使多线程同步
[打印本页]
作者:
qq263946146
时间:
2016-3-1 21:46
标题:
231上位机VC MFC使用信号量使多线程同步
(, 下载次数: 3)
上传
点击文件名下载附件
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);
}
(, 下载次数: 0)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4