c++多线程(二)

多线程实例二

此实例演示采用CreateThread函数在主线程中创建一个线程,并且向创建的线程中传递一个参数。

由于采用MFC编程,自动生成的代码比较多,还是列出部分实现多线程的代码。

线程函数:

void ThreadProc(int count)
{
	for (int i=0; i < count; i++)
	{
		Beep(2000,50);
		Sleep(200);
	}
}

主线程函数:

void CMthread2Dlg::OnStart() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);//从控件中检索数据
	int count = m_count;


	hThread = CreateThread(NULL,
						   0,
						   (LPTHREAD_START_ROUTINE)ThreadProc,
						   (VOID *)count,
						   0,
						   &threadID
						   );


	GetDlgItem(IDC_START)->EnableWindow(FALSE);
	WaitForSingleObject(hThread,INFINITE); //当线程挂起时,为有信号状态
	GetDlgItem(IDC_START)->EnableWindow(TRUE);
}
注:变量m_count和控件IDC_COUNT做了关联。
函数说明:

     BOOL UpdateData( BOOL bSaveAndValidate = TRUE );

    MFC中的窗口函数,在对话框中,当建立控件和变量之间的关联关系后,修改变量值,希望对话框更新显示,则bSaveAndValidate=FALSE,即调用UpdateData(FALSE);当需要获取对话框中控件输入的值时,则bSaveAndValidate=TRUE,即调用UpdateData(TRUE)。

    

   DWORD WaitForSingleObject(
  HANDLE hHandle,        // handle to object
  DWORD dwMilliseconds   // time-out interval
);

     此函数的详细描述参见:http://blog.csdn.net/richerg85/article/details/7354154

注意:

主线程中,调用了WaitForSingleObject函数,此函数的作用是监视hHandle的状态,当监视的句柄为有信号状态时,即此对象为空闲状态时,此函数返回,才能执行其后的代码。

在此处,用WaitForSingleObject作用:

由于c++主程序终止,同时它创建的相应的线程也会终止,它不管子线程是否执行完成,因此,上文中如果不调用WaitForSingleObject函数,则子线程ThreadProc可能没有执行完或者没执行。

  

此程序执行结果图:


多线程实例三

此实例演示多线程中,主线程向子线程传递一个结构体。

在头文件中,声明线程函数及结构体:

UINT ThreadProc(LPVOID lpParam);
struct threadInfo
{
	UINT nMilliSecond;
	CProgressCtrl *pctrProcess;
};

子线程定义函数

threadInfo myInfo;
UINT ThreadProc(LPVOID lpParam)
{
	threadInfo *pInfo = (threadInfo *)lpParam;
	for (int i=0; i<100; i++)
	{
		int iTmp = pInfo->nMilliSecond;
		pInfo->pctrProcess->SetPos(i);
		Sleep(iTmp);
	}
	return 0;
}
主线程调用子线程函数:

void CMthread3Dlg::OnStart() 
{
	// TODO: Add your control notification handler code here
	UpdateData();//默认为TRUE
	myInfo.nMilliSecond = m_nMillSecond;
	myInfo.pctrProcess = &m_ctrProcess;

	hThread = CreateThread(NULL,
							0,
							(LPTHREAD_START_ROUTINE)ThreadProc,
							&myInfo,
							0,
							&threadID
							);
	/*GetDlgItem(IDC_START)->EnableWindow(FALSE);
	WaitForSingleObject(hThread,INFINITE);
	GetDlgItem(IDC_START)->EnableWindow(TRUE);*/
}

注意注释的部分,如果调用WaitForSingleObject函数,此程序会出现死锁。因为对话框中有个进度条,子线程中设置进度条的进度,但是进度条的刷新需要主线程来完成,当主线程调用WaitForSingleObject函数挂起后,子线程设置正在设置进度条,一直等待主线程将刷新消息出来完毕返回才检测通知事件。这样两个线程一直处于相互等待,出现死锁。

程序执行结果:


程序完整源代码下载地址:

http://download.csdn.net/detail/richerg85/4215491

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值