本文介绍MFC中图像采集及图像处理的多线程编方法。创建了三个线程,分别为图像采集、图像处理及图像显示线程。线程之间的共享数据有保存的图像链表和图像处理结果存储结构。
图像链表:list<Hobject> imgList;
存储结构体:
struct ResultContainer
{
Hobject result_img;
HTuple time_needed;
HTuple result_handle;
HTuple result_data;
};
创建4个事件保证线程同步性
HANDLE fgStopEvent;
HANDLE newImageEvent;
HANDLE newResultEvent;
HANDLE containerIsFreeEvent;
使用2个关键段保证共享数据使用的互斥性
CRITICAL_SECTION newImageMutex;
CRITICAL_SECTION resultDataMutex;
同时在头文件中加入私有成员变量:
HANDLE dispThrHandle; //Win32线程句柄
unsigned int dispThreadId; //Win32线程标识符
HANDLE ipThrHandle; //Win32线程句柄
unsigned int ipThreadId; //Win32线程标识符
HANDLE fgThrHandle; //Win32线程句柄
unsigned int fgThreadId; //Win32线程标识符
- 在初始化中进行关键段的初始化,创建线程等其他数据初始化过程:
关键段初始化:
InitializeCriticalSection(&newImageMutex);
InitializeCriticalSection(&resultDataMutex);
设置事件句柄以同步线程:
fgStopEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
newImageEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
newResultEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
containerIsFreeEvent =CreateEvent(NULL,FALSE,TRUE,NULL);
初始化共享数据:
resultData.time_needed = NULL;
resultData.result_img = NULL;
resultData.result_handle = NULL;
resultData.result_data = NULL;
其他:
ResetEvent(fgStopEvent); //设置fgStopEvent为无信号状态</