基于VS2010的MFC多线程编程(指针、句柄、整形变量等参数传递 )


1)在VS开发环境,基于MFC创建一个名为ThreadProcess的工程,自动生成窗口类CThreadProcessDlg,一个ThreadProcessDlg.cpp和ThreadProcessDlg.h文件

2)在工具栏拉出一个Progress Control控件,默认ID:IDC_PROGRESS1,添加控件变量,设置其变量名为m_speed,

在该窗口类的头文件中的public中自动生成CProgressCtrl  m_speed;

3)添加3个按钮控件h和一个Edit Control控件(给其添加int型变量:m_Var1).窗口布局如下图:




4)在ThreadProcess.h文件中的private中添加全局变量

private:

HANDLE    m_ThreadSpeed;  //声明这个句柄是用于接受创建线程时返回的句柄,可以使用这个句柄对线程控制

5)自己新建.h文件,在该文件中自定义一个结构体,用于传递参数到多线程函数中去。新建.h文件方法:在解决方案中选择   “头文件” -》右键 -》添加  -》新建项 ,选择头文件-》输入名称。我这里的名称为“ThreadFuantion.h”。下面是我新建的头文件中添加的内容。主要是建立了一个结构体,用于存储需要传递到多线程程序中的各种类型的变量

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include  <process.h>


typedef struct tag_Param
{
	HANDLE hMutex;
	int thread_id;
	int var1;
	int var2;
	CWnd* kk;
	bool bStop;
}TESTPARAM;

6)在ThreadProcessDlg.h文件中申明一个结构体。

private:
TESTPARAM TestParam;

7)双击窗体中的【开始】按钮  在其响应函数中创建一个线程:

//开始
void CThreadProcessDlg::OnBnClickedButton1()
{
	m_ThreadSpeed = CreateThread(\
	0,				//lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。
	0,				//dwStackSize,   设置初始栈的大小,以字节为单位,如果为0,那么默认将使用与调用该函数的线程相同的栈空间大小
	ThreadSpeed,	//lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,
					//但是必须以下列形式声明:DWORD WINAPI 函数名 (LPVOID lpParam) ,格式不正确将无法调用成功。
	reinterpret_cast<LPVOID *>(&TestParam),//向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。
	0,				//线程标志,可取值如下 a) CREATE_SUSPENDED(0x00000004):创建一个挂起的线程,  b) 0:表示创建后立即激活。c)...	
	0);				//保存新线程的id。
//	CloseHandle(m_ThreadSpeed);     //一般创建后马上关闭线程句柄,因为主线程不关系创建的新线程。如果创建新线程后马上注销的话,
								    //不能再对线程进行 挂起  唤醒等操作
}

注意:对结构体类型的强制转换,非常必要!!!

8)双击【+1】添加如下代码     每按一次【+1】按钮变量m_Var1自增10;
void CThreadProcessDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	m_Var1+=10;
	TestParam.kk = this;
	TestParam.var1=m_Var1;
	UpdateData(false);
}
9)8)双击【-1】添加如下代码     每按一次【-1】按钮变量m_Var1自减10;
void CThreadProcessDlg::OnBnClickedButton3()
{
	// TODO: 在此添加控件通知处理程序代码
	m_Var1-=10;
	TestParam.kk = this;
	TestParam.var1=m_Var1;
	TestParam.var2=m_Var1;
	UpdateData(false);
}

10)同样在ThreadProcessDlg.cpp文件中添加开辟新线程的执行函数

//线程函数的实现
DWORD WINAPI CThreadProcessDlg::ThreadSpeed(LPVOID lpParameter)
{
	int Count;
	TESTPARAM *ptr=reinterpret_cast<TESTPARAM *>(lpParameter);   //lpParameter参数带来了丰富的信息,具体自己可以在结构体中定义
	CThreadProcessDlg *Dlg=(CThreadProcessDlg *)ptr->kk;         //TestParam.kk = this;将主窗口的指针带回,方便获取其中变量和资源
	CWnd * pwnd = Dlg->GetDlgItem(IDC_PROGRESS1);                //通过窗体指针,获取进度条的句柄
	CProgressCtrl *Speed = (CProgressCtrl*)pwnd; 		     //获取进度条的指针,从而方便在新开辟的线程中对其操作
	Speed->SetRange(0,100);					     //设置进度条的范围
	while(1)					             //while(1)循环,只要主线程中的m_Var1改变,我们就能在进度条上反映出来
	{
		Speed->SetPos(Dlg->m_Var1);
		_sleep(200);
	}
	return 0;
}
 

最终实现:按下【开始】开辟新线程,  按下【+1】或【-10】改变m_Var1,自定义的结构将改变的变量传递给线程执行的函数。从而改变进度条的位置。

 

          













评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值