线程有很多便利但也有很多需要注意的问题.如何防止两个线程在同一时间访问同一数据,使隶属于同一个进程的各线程协调一致地工作称之为线程的同步.
MFC提供了多种同步对象,如CEvent,CCriticalSection,CSemaphore,CMutex.另外MFC提供了线程的辅助类CSingleLock和CMutiLock。
使用CEvent 对象实现线程同步:
1. 首先在主线程界面的实现文件中创建一个CEvent对象。
2. 在主线程界面的实现文件中创建工作线程的线程函数
UNIT ThreadFun(LPVOID pParam)
{
WaitForSingleObject(HANDLE hHandle , DWORD dwMillisecond);
// 等待工作线程事件的相应,hHandle为同步对象的句柄
// 如g_Event.m_hObject
if()
{
//处理异常情况
AfxEndThread(2);
}
//完成其他任务
g_Event.SetEvent(); //完陈工作线程任务后设置对象为有信号状态
return 0;
}
3. 写一个线程启动函数,可以使某个消息相应。
g_Event.SetEvent(); //设置为有信号状态
WaitForSingleObject(g_Event.m_hObject, INFINITE);
//等待同步事件;
//某事件响应
AfxBeginThread(ThreadFun, XXX);
//产生一个工作线程来处理业务
自身的处理函数();
g_Event.SetEvent(); //设置为有信号状态
WaitForSingleObject(g_Event.m_hObjec, INFINITE);
MFC提供了多种同步对象,如CEvent,CCriticalSection,CSemaphore,CMutex.另外MFC提供了线程的辅助类CSingleLock和CMutiLock。
使用CEvent 对象实现线程同步:
1. 首先在主线程界面的实现文件中创建一个CEvent对象。
2. 在主线程界面的实现文件中创建工作线程的线程函数
UNIT ThreadFun(LPVOID pParam)
{
WaitForSingleObject(HANDLE hHandle , DWORD dwMillisecond);
// 等待工作线程事件的相应,hHandle为同步对象的句柄
// 如g_Event.m_hObject
if()
{
//处理异常情况
AfxEndThread(2);
}
//完成其他任务
g_Event.SetEvent(); //完陈工作线程任务后设置对象为有信号状态
return 0;
}
3. 写一个线程启动函数,可以使某个消息相应。
g_Event.SetEvent(); //设置为有信号状态
WaitForSingleObject(g_Event.m_hObject, INFINITE);
//等待同步事件;
//某事件响应
AfxBeginThread(ThreadFun, XXX);
//产生一个工作线程来处理业务
自身的处理函数();
g_Event.SetEvent(); //设置为有信号状态
WaitForSingleObject(g_Event.m_hObjec, INFINITE);