使用Event同步线程

发表于:2007-06-11来源:作者:点击数: 标签:
Win32写多线程的时候经常需要线程同步,同步的方法很多,效率也不一样,这里介绍一种Event同步对象。 建立一个MFC基于Dialog的工程,界面如图: java script:if(this.width>498)this.style.width=498;' onmousewheel = 'javascript:return big(this)' alt=""

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 函数。



原文转自:http://www.ltesting.net

...