先看一个案例,基于对话框程序,添加两个按钮,按钮1: “十秒计时” IDC_COUNT
按钮2: “ 显示对话框” IDC_SHOW
分别给它们添加BN_CLICK响应函数:
void CMy1802Dlg::OnCount()
{
// TODO: Add your control notification handler code here
Sleep(10000); // 程序休眠十秒
AfxMessageBox("十秒时间结束! ");
}
void CMy1802Dlg::OnDisplay()
{
// TODO: Add your control notification handler code here
AfxMessageBox("Hello world!");
}
编译、链接、运行,
当点击了按钮1后,再点击按钮2,程序并不响应,直到OnCount() 执行完毕,即Sleep(10000) 十秒结束之后,程序才会响应按钮2的点击。
如果时间不是十秒,而是十分钟,十个小时呢,那么漫长的等待时间就恐怖了。
有没有办法,程序在执行“十秒计时”的期间,程序同时也能响应点击按钮二呢?
有!
新建一个线程就能解决这个问题。
当点击按钮“十秒计时”后,程序创建一个工作者线程,让这个Sleep(10000)的任务,交给这个新线程去执行,这样,程序能随时响应按钮2的点击呢。
代码实现:
// 先编写新线程的执行函数的具体实现
UINT MyWorkThread(LPVOID pParam)
{
int p=(int)pParam;
Sleep(p);
AfxMessageBox("十秒时间结束!");
return 0;
}
// 改写按钮1的BN_CLICKED 消息响应函数
void CMy1802Dlg::OnCount()
{
// TODO: Add your control notification handler code here
int n=10000;
AfxBeginThread(MyWorkThread,(LPVOID)n); // 点击按钮1 ,创建一个新的线程,它的执行函数为:MyWorkThread
}
注意:
1、工作者线程的执行函数MyWorkThread的具体实现,一定要放在按钮2的响应函数的前面,
如果放在后面,也行,那得在程序的头文件中,先对它进行声明。
2、当用户点击了按钮一之后,程序会执行OnCount()函数 ,OnCount()函数中调用AfxBeginThread(),会创建一个新线程,
新线程的执行函数就是MyWorkThread(),