工控编程吧
标题:
230上位机VC MFC使用事件对象使线程同步
[打印本页]
作者:
qq263946146
时间:
2016-3-1 21:35
标题:
230上位机VC MFC使用事件对象使线程同步
(, 下载次数: 2)
上传
点击文件名下载附件
230上位机VC MFC使用事件对象使线程同步
功能展示
程序同时启动两个线程访问同一变量时就得控制线程的访问顺序,防止出现意外,使多个线程按指定的顺序执行任意就叫线程的同步,我们当前例程使用一个事件对象,实现了线程的同步,效果如图,点击正常执行两线程和使用事件对象实现两线程同步,可以看出线程向编程框写入文本的不同顺序;
要点提示
例程使用事件对象Cevent构造函数默认有参数创建实现,其默认构造原型为
CEvent(
BOOL bInitiallyOwn /* = FALSE */ , //用来指定事件对象初始状态是否为发信状态(默认值为未发信)
BOOL bManualReset /* = FALSE */ , //用来指定创建的事件对象是自动事件还是手动事件对象(默认值为自动事件对象)
LPCTSTR lpszNAme /* = NULL */ , //用来定义事件对象的名称
LPSECURITY_ATTRIBUTES lpsaAttribute /* = NULL */ //指向一个LPSECURITY_ATTRIBUTES结构的指针 )
也就是定义的对象为自动事件对象。初始状态为未发信状态,可以用SetEvent使之变为发信状态,等待线程中的第一个线程恢复运行,但事件对象会随即自动将其变为未发信状态,从而使其他处于等待状态的线程仍然被阻塞。
实现功能
1.新建基于对话框的应用程序
2.拖拽一编辑框ID为IDC_EDIT1,设置接收回车和多行属性,添加两按钮<正常执行两线程><使用事件对象实现两线程同步>关联函数
void CGkbc8Dlg::OnNormal()
{
CEdit*pEdit=(CEdit*)GetDlgItem(IDC_EDIT1);
pEdit->SetWindowText("正常执行两线程:\r\n");
AfxBeginThread(ThreadFun1,pEdit);
AfxBeginThread(ThreadFun2,pEdit);
}
void CGkbc8Dlg::OnEvent()
{
CEdit*pEdit=(CEdit*)GetDlgItem(IDC_EDIT1);
pEdit->SetWindowText("使用事件对象实现两线程同步:\r\n");
AfxBeginThread(ThreadFun3,pEdit);
AfxBeginThread(ThreadFun4,pEdit);
}
复制代码
3.在此两按钮前面添加线程函数ThreadFun1, ThreadFun2,ThreadFun3, ThreadFun4及事件对象实现及对象所在头文件
#include <afxmt.h>//CEvent头文件
CEvent g_Event;//事件对象变量
static UINT ThreadFun1(LPVOID pParam)
{
CEdit*pEdit=(CEdit*)pParam;
CString sText;
复制代码
for(int i=0;i<25;i++)
{
pEdit->GetWindowText(sText);
sText+="k";
pEdit->SetWindowText(sText);
Sleep(50);
}
pEdit->GetWindowText(sText);
sText+="\r\n";
pEdit->SetWindowText(sText);
return 0;
} static UINT ThreadFun2(LPVOID pParam)
{
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);
return 0;
}
static UINT ThreadFun3(LPVOID pParam)
{
CEdit*pEdit=(CEdit*)pParam;
CString sText;
for(int i=0;i<25;i++)
{
pEdit->GetWindowText(sText);
sText+="B";
pEdit->SetWindowText(sText);
Sleep(50);
}
复制代码
pEdit->GetWindowText(sText);
sText+="\r\n";
pEdit->SetWindowText(sText);
g_Event.SetEvent();//让线程4执行
return 0;
}
static UINT ThreadFun4(LPVOID pParam)
{
g_Event.Lock();//挂起直到线程3触发
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);
return 0;
}
复制代码
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/ed6310b7f816febd4fea2d958ce42a15/0/0/w_19rsxg4g5h.swf-albumId=5507037609-tvId=5507037609-isPurchase=0-cnId=12[/iqiyi]、
(, 下载次数: 3)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4