【语言-C++】多线程通同步 临界区 CCriticalSection 与 CSingleLock

【语言-C++】多线程通同步 临界区 CCriticalSection 与 CSingleLock多线程通同步与互斥示例下面示例是一个相机处理和显示分开的两个线程:定义临界区使用单锁#define_CRITICAL_LOCK(critical_lock) CSingleLocklocker(&critical_lock); locker.Lock();CCriticalSection_critical_data2;启动线程,创建四个事件:停止线程事件、处理图

大家好,又见面了,我是你们的朋友全栈君。

多线程通同步与互斥示例

下面示例是一个相机处理和显示分开的两个线程:

定义临界区使用单锁

#define _CRITICAL_LOCK(critical_lock)			CSingleLock locker(&critical_lock);	locker.Lock();
CCriticalSection _critical_data2;

启动线程,创建四个事件:停止线程事件、处理图像事件、显示图像事件和接收图像事件

停止线程事件:线程接受自动复位 ,初始状态为无信号状态;控制两个线程同时结束

处理图像事件:手动复位,初始状态为无信号状态;

显示图像事件:手动复位,初始状态为无信号状态;

接收图像事件:手动复位,初始状态为有信号状态;

处理图像事件和显示图像事件同时发生时,激活图像处理线程,进行图像处理;接收图像事件的时间的触发由显示图像完成后触发;处理图像事件由相机线程图像传输来触发;

显示图像事件发生时激活显示图像线程进行图像处理。

创建线程

void CMainDlgEx::StartThread()
{
	m_EventStop			= CreateEvent(NULL,TRUE,FALSE,NULL);
	m_EventDealImage		= CreateEvent(NULL,FALSE,FALSE,NULL);
	m_EventImageShow		 = CreateEvent(NULL,FALSE,FALSE,NULL);
	m_EventAllowReceiveImage = CreateEvent(NULL,FALSE,TRUE,NULL);
	// auxiliary methods
	ResetEvent(m_EventStop);
	SetEvent(m_EventAllowReceiveImage);
	// 启动三个线程 
	m_HTDealImage = (HANDLE)_beginthreadex(NULL,								
		0,								
		(unsigned (__stdcall *)(void*))	&Thread_DealImage,
		this,					
		0,					
		&m_IDDealImage);			

	m_HTShowImage = (HANDLE)_beginthreadex(NULL,					
		0,					
		(unsigned (__stdcall *)(void*))&Thread_ShowImage,	
		this,					
		0,					
		&m_IDShowImage);					
}

关闭线程

void CMainDlgEx::CloseThread()
{  
	SetEvent(m_EventStop);       
	WaitForSingleObject(m_HTShowImage,INFINITE);
	WaitForSingleObject(m_HTDealImage,INFINITE);
	if (m_EventStop!=NULL &&m_EventStop !=INVALID_HANDLE_VALUE)
		CloseHandle(m_EventStop);
	if (m_EventDealImage!=NULL &&m_EventDealImage !=INVALID_HANDLE_VALUE)
		CloseHandle(m_EventDealImage);
	if (m_EventAllowReceiveImage!=NULL &&m_EventAllowReceiveImage !=INVALID_HANDLE_VALUE)
		CloseHandle(m_EventAllowReceiveImage );
	if (m_EventImageShow!=NULL &&m_EventImageShow !=INVALID_HANDLE_VALUE)
		CloseHandle(m_EventImageShow);
	DeleteCriticalSection(&m_DealImageMutex);
}

处理线程

void Thread_DealImage(LPVOID *lpParam)
{
	OutputDebugString(_T("处理中 ....启动\n"));
	HANDLE      eventHandle[2];
	CMainDlgEx *MultiThrDlg = (CMainDlgEx*) lpParam;	

	eventHandle[0] = (*MultiThrDlg).m_EventAllowReceiveImage; 
	eventHandle[1] = (*MultiThrDlg).m_EventDealImage;  

	while (WAIT_OBJECT_0 != WaitForSingleObject((MultiThrDlg->m_EventStop),0))
	{
		//抓取数据到grabData中
		while (WAIT_OBJECT_0 == WaitForMultipleObjects(2,eventHandle,TRUE,0))
		{
			_CRITICAL_LOCK(_critical_data2);
			OutputDebugString(_T("处理中 ....\n"));
			SetEvent(MultiThrDlg->m_EventImageShow);
		}
	}
	ResetEvent(MultiThrDlg->m_EventDealImage);
	ResetEvent(MultiThrDlg->m_EventAllowReceiveImage);
	OutputDebugString(_T("处理中 ....退出\n"));
	return;
}

显示线程

extern void Thread_ShowImage( LPVOID *lpParam ) { HANDLE eventHandle[2]; CMainDlgEx *MultiThrDlg = (CMainDlgEx*) lpParam; OutputDebugString(_T("显示中 ....启动\n")); while (WAIT_OBJECT_0 != WaitForSingleObject((MultiThrDlg->m_EventStop),0)) { //抓取数据到grabData中 while (WAIT_OBJECT_0 == WaitForSingleObject((MultiThrDlg->m_EventImageShow),0)) { _CRITICAL_LOCK(_critical_data2); OutputDebugString(_T("显示中 ....\n")); SetEvent(MultiThrDlg->m_EventAllowReceiveImage); } } ResetEvent(MultiThrDlg->m_EventImageShow); ResetEvent(MultiThrDlg->m_EventAllowReceiveImage); OutputDebugString(_T("显示中 ....退出\n")); return; }

数据到达

LRESULT CMainDlgEx::OnCameraDataArrive(WPARAM w, LPARAM l)	
{
	SetEvent(m_EventDealImage);
	return -1;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162060.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • js checkbox复选框实现单选功能[通俗易懂]

    js checkbox复选框实现单选功能[通俗易懂]本文仅供学习交流使用,如侵立删!联系方式及demo下载见文末jscheckbox复选框实现单选功能<scripttype=”text/javascript”> $(“:checkbox”).click(function(){ $(this).attr(“checked”,true);//设置当前选中checkbox的状态为checked $(this).siblings().attr(“checked”,false);//设置当前选中的checkbox同级(兄弟级

    2022年5月7日
    149
  • oracle未明确定义列[通俗易懂]

    oracle未明确定义列[通俗易懂]分类:SQL使用技巧2012-04-0616:121332人阅读评论(0)收藏举报运行环境:Oracle10gsqlplus环境下。 在查询语句中,经常会出现一个错误: SQL基础:ORA-00918:未明确定义列的错误。 当前遇到有两种情况。原因为:当查询语句中,查询的表(数据集)中有相同的字

    2022年10月5日
    0
  • 【动画教程】真封神南极服务端2.52架设第四集「建议收藏」

    【动画教程】真封神南极服务端2.52架设第四集「建议收藏」官方网站www.zfs2014.com动画名称:真封神南极服务端2.52架设第四集主讲人:diablo2208教程下载地址:http://pan.baidu.com/s/1bnf9EkZ

    2022年7月24日
    9
  • Python SMTP 163邮箱发送邮件不成功[通俗易懂]

    Python SMTP 163邮箱发送邮件不成功[通俗易懂]新的教程,可以成功发送(Python3)importsmtplibfromemail.mime.textimportMIMEText#第三方SMTP服务mail_host="smtp.163.com"#SMTP服务器mail_user="username"#用户名mail_pass="passwd"#密码sender=’user@16…

    2022年9月3日
    5
  • JAVA string转map_java怎么转业务

    JAVA string转map_java怎么转业务String转Mapstring转map的时候,很多新人可能不会去判断string的内容是什么格式的,因为map是key-value格式的,但是string就是一个字符串,想想,这个应该不能转吧,我就遇到过,想想就觉得自己傻傻的,哈哈哈。看代码 Stringcontent=””;HashMap<String,Object>map=newHashMap<>();try{map=JS

    2022年9月11日
    0
  • vscode新建文件,默认为html[通俗易懂]

    vscode新建文件,默认为html[通俗易懂]虽然还没达到理想目标,不过还是有进步步骤如下图文字版打开vscode–选择文件–首选项–设置到达设置页面文件(14)–找到要复制代码–复制,在加个html效果如下图右下脚由纯文本变为html…

    2022年8月22日
    21

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号