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;
- }
复制代码
|