一. 使用线程步骤:
1. 定义线程函数传递参数结构
如:
typedef struct tagTHREADPARMS
{
//CString content;
HWND hwnd;
int window;
int state;
Monitor *mm;
int thread_id;
}THREADPARMS;
2. 定义线程函数:
如:
UINT read(LPVOID pParam)
{
//一个函数而已
THREADPARMS *p=(THREADPARMS*)pParam;
HWND hwnd=p->hwnd;
int edit=p->window;
Monitor *mon=p->mm;
mon->add_reader(p);
SetDlgItemText(hwnd,p->state,"正在读取");
Sleep(2000);
char * str=new char[1000];
GetDlgItemText(hwnd,IDC_DISPLAY,str,1000);
SetDlgItemText(hwnd,edit,str);
mon->complete_reader(p);
SetDlgItemText(hwnd,p->state,"读取完成");
delete p;
return 0;
}
3. 启动线程
如:
THREADPARMS *ptp=new THREADPARMS;//初始化线程参数结构
ptp->hwnd=m_hWnd;//对PTP结构赋值
ptp->mm=mm;
ptp->window=window;
ptp->thread_id=thead_id;
ptp->state=state;
AfxBeginThread(read,ptp);//启动线程
二. 线程的挂起和重启
1. 挂起线程
SuspendThread(HANDLE);
注意:线程暂停后便停止运行,也就是说线程可以自己挂起自己,但无法自己唤醒自己。
2.唤醒线程
ResumeThread(HANDLE);
对于CWinThread 类,只要使用m_hThread成员,即为HANDLE变量。
超级注意:GetCurrentThread()得到的是一个当前的线程的handle,其实是一个伪HANDLE,是当前所有运行的线程环境的HANDLE。无法直接使用此函数得到的handle唤醒线程。但是使用一些其他函数后可以,我没有尝试。
还有,MFC中的线程是不安全的。不安全的含义是:当两个线程同时访问同一个临界资源时,系统会允许。这就会产生一些不可预知的错误。
解决的方法时使用进程的同步类或者自己编写代码实现线程互斥访问和同步。
更多内容欢迎访问围观IT