首页 > 编程知识 正文

临界区三个要求(【语言-C 】多线程通同步 临界区 CCriticalSection 与 CSingleLock)

时间:2023-05-03 18:02:11 阅读:123559 作者:808

多线程同步和互斥示例以下示例是摄像机处理和显示单独线程的示例。

使用单锁定义关键节

# define _ critical _ lock (critical _ lock ) csinglelocklocker (critical _ lock ); locker.Lock (; ccriticalsection _ critical _ data 2;

启动线程并创建四个事件:停止线程事件、处理图像事件、查看图像事件和接收图像事件

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

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

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

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

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

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

创建线程voidcmaindlgex :3360 start thread ((m _ event stop=create event ) NULL、TRUE、FALSE、NULL ); m _ eventdealimage=create event (null、FALSE、FALSE、null ); m _ eventimageshow=create event (空、假、假、空); m _ eventallowreceiveimage=create event (null、FALSE、TRUE、null ); //auxiliarymethodsresetevent (m _ event stop ); setevent (m _ eventallowreceiveimage;//三个线程m_HTDealImage=(HANDLE ) _beginthreadex(null,0,) unsigned ) _ stdcall * (void * ) ) thread_deal )

关闭线程

voidcmaindlgex :3360 closethread () setevent ) m_eventstop ); waitforsingleobject (m _ ht show image,INFINITE; waitforsingleobject (m _ htdealimage,INFINITE; if(m_Eventstop!=NULL m_EventStop!=invalid _ handle _ value (closehandle (m _ event stop ); if(m_eventdealimage!=NULL m_EventDealImage!=invalid _ handle _ value (closehandle (m _ eventdealimage ); if(m_eventallowreceiveimage!=NULL m_EventAllowReceiveImage!=invalid _ handle _ value (关闭手柄(m _ eventallowreceiveimage ); if(m_eventimageshow!=NULL m_EventImageShow!=invalid _ handle _ value (closehandle (m _ eventimageshow ); deletecriticalsection (m _ dealimagemutex; }

线程处理

void thread _ deal image (lpvoid * lpparam ) outputdebugstring ) )处理中)启动(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 _ event stop ),0 ) grabData的while ) wait_object_0==waitformulttta中的数据setevent (multithrdlg-m _ eventimageshow; } reset event (multithrdlg-m _ eventdealimage; reset event (multithrdlg-m _ eventallowreceiveimage; 正在进行outputdebugstring(_t )处理…结束(n ) ); 返回; }

线程externvoidthread _ show image (lpvoid * lpparam ) {HANDLE eventHandle[2]; cmaindlgex * multithrdlg=(cmaindlgex * ) lpParam; outputdebugstring(_t ) '正在显示…启动n ' ); while(wait_object_0!=waitforsingleobject ((multithrdlg-m _ event stop ),0 ) grabData的while ) wait _ object _0==waitforsingect outppt setevent (multithrdlg-m _ eventallowreceiveimage; } reset event (multithrdlg-m _ eventimageshow; reset event (multithrdlg-m _ eventallowreceiveimage; outputdebugstring(_t ) '正在显示…退出n ' ); 返回; }

数据到达

lresultcmaindlgex :3360 oncameradataarrive (wparamw,LPARAM l ) setevent ) m_eventdealimage ); 返回- 1; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。