工控编程吧
标题:
232上位机VC MFC使用互斥对象使多线程同步
[打印本页]
作者:
qq263946146
时间:
2016-3-1 21:50
标题:
232上位机VC MFC使用互斥对象使多线程同步
(, 下载次数: 3)
上传
点击文件名下载附件
232上位机
VC MFC使用互斥对象使多线程同步
功能展示
多个线程按指定顺序运行,是基本的一个功能,不然程序运行中会出现意想不到的问题,当前例程利用互斥对象,实现多个线程间的同步,让多个线程有序的向编辑框写入字符,效果如图,点击按钮,五个线程按先后顺序依次向编辑框写入工控编程吧;
要点提示
互斥类CMutex的实例对象,只允许一个线程占有某个共享资源,以保护独占式共享资源。因此,互斥体的使用方法与临界段的使用方法极为相似,所不同的是临界段只能在同一个进程中对线程进行同步,而互斥体可以用在不同的进程中进行线程同步控制。
CMutex类的构造函数原型为:
CMutex(
BOOL bInitiallyOwn /* = FALSE */, //用来指定互斥体对象初始状态是锁定(TRUE)还是非锁定(FALSE)
LPCTSTR lpszName /* = NULL */, //用来指定互斥体的名称
LPSECURITY_ATTRIBUTES lpsaAttribute /* = NULL */ //为一个指向SECURITY_ATTRIBUTES结构的指针
)
该对象的使用方法与临界段对象的使用方法相似,在线程中获得互斥体对象可以调用成员函数Lock(),需要交出互斥体对象时,调用成员函数UnLock()。
实现功能
1.新建基于对话框的应用程序
2.拖拽一编程框ID为IDC_EDIT1修改属性多行,接收回车;拖拽按钮<使用互斥对象 使线程同步 向编辑框写入字符>关联函数
void CGkbc8Dlg::OnButton1()
{
CEdit*pEdit=(CEdit*)GetDlgItem(IDC_EDIT1);
pEdit->SetWindowText("使用互斥对象实现多线程同步:\r\n\r\n");
AfxBeginThread(ThreadFun1,pEdit);
AfxBeginThread(ThreadFun2,pEdit);
AfxBeginThread(ThreadFun3,pEdit);
AfxBeginThread(ThreadFun4,pEdit);
AfxBeginThread(ThreadFun5,pEdit);
}
复制代码
3.再在此函数前面添加互斥对象及互斥类的头文件,一个线程函数,这时示例两个线程函数
#include <afxmt.h>//CMutex头文件
CMutex g_Mutex(FALSE,NULL);
static UINT ThreadFun1(LPVOID pParam)
{
g_Mutex.Lock();
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";
pEdit->SetWindowText(sText);
g_Mutex.Unlock();
return 0;
}
static UINT ThreadFun2(LPVOID pParam)
{
g_Mutex.Lock();
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";
pEdit->SetWindowText(sText);
g_Mutex.Unlock();
return 0;
}
复制代码
(, 下载次数: 0)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4