一 工作者线程和用户界面线程
MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。
所以不要在工作者线程中做用户事件响应也不要做其他界面操作 .
二 CreateThread()
HANDLE WINAPI CreateThread(
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, //子进程能否继承这个线程句柄
_In_ SIZE_T dwStackSize, //线程栈大小
_In_ LPTHREAD_START_ROUTINE lpStartAddress, //线程函数名称
_In_opt_ LPVOID lpParameter, //传入线程函数的参数
_In_ DWORD dwCreationFlags, //0:立即启用新线程, CREATE_SUSPENDED:挂起
_Out_opt_ LPDWORD lpThreadId); //保存新线程的ID号
DWORD WINAPI MyThreadFunction( LPVOID lpParam );
HANDLE hThreadArray;
DWORD dwThreadIdArray;
hThreadArray = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyThreadFunction, "param",0,&dwThreadIdArray);
if (hThreadArray[i] == NULL)
{ ExitProcess(3); }
// Wait until all threads have terminated.
WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);
TerminateThread(hThreadArray,0);
CloseHandle(hThreadArray);
hThreadArray = NULL;
注意: 线程函数必须是全局函数或者静态函数, 否则会提示类型转换错误.
WaitForMultipleObjects()等待线程结束
三 退出
1 线程结束//调用析构函数,释放线程栈,线程内核对象减一 .总之很完美
2 ExitThread(dwExitCode) 线程中调用此函数退出
3 TerminateThread(hThreadArray); 线程调用此函数结束其他线程 ,用TerminateThread结束的线程系统会保留线程栈以便其他线程访问.
四 互斥对象
使用互斥对象保证只有一个进程运行
//Check and create mutex.
m_hMutex = CreateMutex(NULL, FALSE, UTILITY_NAME);//互斥对象用来多线程访问共享资源
if(m_hMutex==NULL)
{
MessageBox(_T("創建互斥對象失敗!!"),UTILITY_NAME,MB_OK|MB_ICONINFORMATION);
CloseHandle(m_hMutex);
EndDialog(1);
return FALSE;
}
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
MessageBox(TEXT("本程序已經在運行!!"),UTILITY_NAME,MB_OK|MB_ICONINFORMATION);
CloseHandle(m_hMutex);
EndDialog(1);
return FALSE;
}