Win32写多线程的时候经常需要线程同步,同步的方法很多,效率也不一样,这里介绍一种Event同步对象。
建立一个MFC基于Dialog的工程,界面如图:
// 线程部分 全部为全局变量和函数
const int MAX_THREAD = 3;
HANDLE hEvent = NULL; // handle to event object
HANDLE hThread[MAX_THREAD];
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
char buf[64];
HWND hList = ::GetDlgItem(theApp.m_pMainWnd->m_hWnd, IDC_LISTRESULT);
for(;;)
{
sprintf(buf, "Thread #%d Wait.", lpParameter);
ListBox_SetTopIndex(hList, ListBox_AddString(hList, buf));
WaitForSingleObject(hEvent, INFINITE);
sprintf(buf, "Thread #%d work.", lpParameter);
ListBox_SetTopIndex(hList, ListBox_AddString(hList, buf));
Sleep(0);
}
}
void StartThread(void)
{
for(int i = 0; i < MAX_THREAD; i++)
{
hThread[i] = CreateThread(NULL, 0, ThreadProc, (LPVOID)i, 0, NULL);
}
}
void KillThread(void)
{
for(int i = 0; i < MAX_THREAD; i++)
{
if(hThread[i] != NULL)
{
TerminateThread(hThread[i], 0);
WaitForSingleObject(hThread[i], INFINITE);
CloseHandle(hThread[i]);
hThread[i] = NULL;
}
}
}
// 按钮的一些消息函数
extern HANDLE hEvent;
void StartThread(void);
void KillThread(void);
void CEventDlg::OnBclean()
{
// TODO: Add your control notification handler code here
ListBox_ResetContent(::GetDlgItem(this->m_hWnd, IDC_LISTRESULT));
}
void CEventDlg::OnBpulse()
{
// TODO: Add your control notification handler code here
PulseEvent(hEvent);
}
void CEventDlg::OnBreset()
{
// TODO: Add your control notification handler code here
ResetEvent(hEvent);
}
void CEventDlg::OnBsetevent()
{
// TODO: Add your control notification handler code here
SetEvent(hEvent);
}
void CEventDlg::OnRauto()
{
// TODO: Add your control notification handler code here
KillThread();
if(hEvent != NULL)
{
CloseHandle(hEvent);
}
hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
StartThread();
}
void CEventDlg::OnRmanual()
{
// TODO: Add your control notification handler code here
KillThread();
if(hEvent != NULL)
{
CloseHandle(hEvent);
}
hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
StartThread();
}
代码中使用了一些例如类似 ListBox_ResetContent 的宏,需要引用 windowsx.h 头文件。如果不使用这些宏,可以直接调用 SendMessage 函数。