MFC中多线程的应用

一. 使用线程步骤:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值