前段时间课设,做了个多线程的项目,现在时间宽裕了一些,回来总结一下在这个过程中遇到的一些难点。
其实,一开始打算就打算做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() |