MFC多线程及同步技术

MFC线程分类
工作者线程 - 主要用于后台的耗时的操作,通常没有用户界面。
用户界面线程 - 拥有独立的用户界面

工作者线程的使用
首先实现线程的回调函数,函数原型:UINT MyControllingFunction( LPVOID pParam );
创建和启动工作则线程AfxBeginThread

用户界面线程的使用
添加CWinThread类的派生类
在派生类的InitInstance()函数中创建用户界面

创建和启动用户界面线程AfxBeginThread

新建一个基于对话框的MFC应用程序,拖放一个List Box控件并为之绑定一个控件类型的变量:m_wndListBox, 添加一个"工作者线程"按钮和一个"用户界面线程"用来创建和启动工作者线程和用户界面线程。

界面如下:
在这里插入图片描述
工作者线程相关代码:

// 定义一个线程函数
UINT WorkProc (LPVOID pParam)
{
        CMFCThreadDlg *pDlg = (CMFCThreadDlg*)pParam;
	for (int i = 0; i < 100; ++i)
	{
		pDlg->m_wndListBox.AddString ("Hello Worker!");
		Sleep (100);
	}
	return 0;
}
void CMFCThreadDlg::OnBtnWorker() 
{// "工作者线程"按钮响应函数
	// TODO: Add your control notification handler code here
	//  创建和启动工作者线程, 把主对话框的this指针传递进去是为了在线程函数中使用对话框类的成员
	AfxBeginThread (WorkProc, this);
}

用户界面线程:

右键工程,New Class ,注意父类选择:CWinThread, 这里类名为:CMyThread

为了创建我们的用户界面, 新建一个对话框资源并用类向导生成对应的对话框类,这里名为:CMyDlg

然后来到我们刚新建的线程类的InitInstance()函数中创建我们的用户界面:

#include "MyDlg.h"
BOOL CMyThread::InitInstance()
{
	// TODO:  perform and per-thread initialization here
	CMyDlg dlg;
	// 保存对话框对象地址到线程类的成员变量中
	m_pMainWnd = &dlg;
	dlg.DoModal ();
	return TRUE;
}

为“用户界面”按钮添加消息响应事件:

#include "MyThread.h"
void CMFCThreadDlg::OnBtnUi() 
{
	// TODO: Add your control notification handler code here
	AfxBeginThread (RUNTIME_CLASS (CMyThread));
}

这用于界面线程创建的线程和主对话框是相对对立的线程,独立操作互不影响
在这里插入图片描述
线程同步:

这里介绍两种同步方式: 使用临界区, 使用信号量

定义临界区变量 :

CCriticalSection sec;  // 使用临界区实现同步操作

定义信号量变量:

CSemaphore sec (2, 2);   // 使用信号量实现同步操作

第一个参数指定信号量的初始大小,第二个参数指定信号量同时使用的最大值
测试代码如下:

#include <afxmt.h>
//CCriticalSection sec;  // 使用临界区实现同步操作
CSemaphore sec (2, 2);   // 使用信号量实现同步操作
UINT CallProc (LPVOID pParam)
{
	int i = (int)pParam;
	CString strMsg;
	strMsg.Format ("第%d个同学在打电话...", i);
	sec.Lock ();
	AfxMessageBox (strMsg);
	sec.Unlock ();
	return 0;
}
void CMFCThread2Dlg::OnButton2() 
{
	// TODO: Add your control notification handler code here
	for (int i = 1; i <= 6; ++i)
		AfxBeginThread (CallProc, (LPVOID)i);
	
}
 
// 使用同步技术之前
UINT ChatProc (LPVOID pParam)
{
	int i = (int)pParam;
	CString strMsg;
	strMsg.Format ("第%d个同学在聊天...", i);
	AfxMessageBox (strMsg); 
	return 0;
}
void CMFCThread2Dlg::OnBtnChat() 
{
	// TODO: Add your control notification handler code here
	for (int i = 1; i <= 6; ++i)
		AfxBeginThread (ChatProc, (LPVOID)i);
	
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值