前段時間課設,做了個多線程的項目,現在時間寬裕了一些,回來總結一下在這個過程中遇到的一些難點。
其實,一開始打算就打算做MFC的多線程程式,但卻是學着Win32入的多線程的門,是以算是遇到了一個岔路,後來就跌跌撞撞就把兩種建立線程的方法和相關的信号量和互斥量都弄了一下,在此總結一下。
如果有錯請大家指正。
轉載請注明:http://blog.csdn.net/code_while/article/details/79111469
其實MFC封裝後的WIN32,但二者在使用時還是有一點點差異的。
一、 在WIN32中,建立線程的方法是CreateThread函數方法,傳回值是HANDLE句柄,對應的函數類型的建立方法為DWORD WINAPI 你的函數名(LPVOID lp);然而,在MFC中卻不可以直接用CreateThread方法,因為CreateThread是Windows自帶的API函數,可以直截了當的建立一個新的線程,但在MFC中建立線程時,需要考慮到MFC中的初始化工作,否則建立的線程是不安全的,極度不容易控制的,是以應該使用封裝了CreateThread方法的AfxBeginThread函數方法,他會建立一個CWinThread對象,然後它将自行調用CWinThread::CreateThread方法對該CWinThread對象進行初始化操作,進而完成了MFC中線程的建立,對應的線程函數類型的建立方法為UINT 你的函數名(LPVOID lp)。
對比一下:
WIN32 | MFC | |
線程建立函數類型 | DWORD WINAPI 你的函數名(LPVOID lp) | UINT 你的函數名(LPVOID lp) |
線程建立 | HANDLE my_thread=CreateThread(線程函數名,參數名,0,0,0,NULL) | CWinThread *my_thread=new CWinThread my_thread=AfxBeginThread(線程名,參數,0,0,0,NULL) |
線程挂起 | SuspendThread(my_thread) | my_thread->SuspendThread() |
線程喚醒 | ResumeThread(my_thread) | my_thread->ResumeThread() |
線程終止 | TerminateThread(my_thread,0) CloseHandle(my_thread) | TerminateThread(my_thread->m_thread,0) |
二、MFC中的互斥量和信号量其實都封裝的WIN32中的互斥量和信号量,可簡單對比如下:
互斥量 | WIN32 | MFC |
建立互斥量 | HANDLE CreateMutex(安全屬性,最初狀态,互斥量名字) | CMutex my_cmutex(FALSE,NULL) |
互斥量加鎖 | WaitForSingleObject(HANDLE h_mutex,時間) | my_cmutex.Lock() |
互斥量解鎖 | ReleaseMutex(HANDLE h_mutex) | my_cmutex.Unlock() |
信号量 | WIN32 | MFC |
建立信号量 | HANDLE CreateSemaphore(安全屬性,初始值,最大值,信号量名字) | CSemaphore*my_csemaphore |
信号量+1 | WaitForSingleObject(HANDLE h_semaphore,時間) | my_csemaphore->Lock() |
信号量-1 | ReleaseSemaphore(HANDLE h_semaphore) | my_csemaphore->Unlock() |