用户界面线程:也是框架线程 ,是用来与用户交换信息的。
线程启动:CWinThread* AfxBeginThread();
例子:m_pHospitalthread=(CHospitalThread*)AfxBeginThread(RUNTIME_CLASS(CHospitalThread));
线程的退出:CWinThread->PostThreadMessage();
例如:m_pHospitalthread->PostThreadMessage(WM_QUIT,0,0);
CWinThread类中的成员变量:
m_pMainWnd 用来存放主窗口对象指针,当指向的主窗口被关闭时,线程停止。一般重载initInstance函数来设置这个变量。
m_pActiveWnd 用来存放活跃窗口的对象指针。
CWinThread类成员函数:
GetMainWnd()得到线程主窗口。
CreatThread() 启动执行线程。
工作者线程:做一些后台的工作,如计算 控制等。
线程的开始:CWinThread *AfxBeginThread();
例如:CWinThread *m_pMeThread=AfxBeginThread((AFX_THREADPROC)ITOSeeDoctor,this);
内部结束线程:AfxEndThread(DWORD dwExitCode);
如:AfxEndThread(0);
外部结束线程:TerminateThread(HANDLE hThread,DWORD dwExitCode);与CloseHandle();联合使用。
例如:GetExitCodeThread(m_pMeThread->m_hThread,&dwCode)//得到退出码。
if(dwCode==STILL_ACTIVE) //用码判断是否线程在运行。
{
TerminateThread(m_pMeThread->m_hThread,0);//退出线程
CloseHandle(m_pMeThread->m_hThread);//放弃线程使用的堆栈。
m_pMeThread=NULL; //线程指针设为空。
}
m_hThread: 指针句柄。 m_pMeThread: CWinThread类型的指针。
DWORD SuspendThread();线程的挂起。
DWORD ResumeThread();线程的恢复。
返回值为挂起或恢复的次数。 线程本身可以挂起自己。
线程间的通讯:
发送消息:PostThreadMessage(UINT message,WPARAM wParam,LPARAM lParam);
接受消息:ON_THREAD_MESSAGE(message,messagefxn)
接受消息宏 ON_THREAD_MESSAGE()必须写到 BEGIN_MESSAGE_MAP与END_MESSAGE_MAP之间。 宏后面没有 ;符号。
定义消息函数过程:
应在.h文件头先定义消息。
如:#define WM_MY_START (WM_USER+1) WM_USER以上都是被保留的消息标记。
然后在函数声明时 前面加afx_msg.
如:afx_msg LONG MySeeStart(UINT wParam,LONG iParam);不要写到afx-msg中。
使用同步类
使用前导如
#include <afxmt.h>
同步对象:1)CSemaphore:允许一定数目的线程访问某个共享资源。
对象->lock(DWORD wdtime); 参数为等待的时间。
例如: CSemaphore *
m_sMaxnumber=new CSemaphore(200,200);
m_sMaxnumber->lock(1000);
当已经有200个信号,前面的参数为0,第201个信号开始等待,如果1秒以后还没信号就离开。
2)CMutex:任何时刻只允许一个线程访问该资源。
3)CEvent:允许一个线程通知其他线程一个时间发生了,也可用于封锁某一资源的访问,直到有信号。