实例学MFC(1)--线程

来源:互联网 发布:waypoint.js 编辑:程序博客网 时间:2024/05/15 00:30

 

 

通过实例我们来看看,MFC到底有多简单。

我们将要实现的例子是,在窗口中显示现在的时间,并实时更新。

我们是行动主义者,废话不多说,开始动手吧。

在VC6.0中,根据向导,建立一个MFC项目(exe,对话框式)。

给窗体添加一个EditBox,ID为IDC_TIME,显示时间用的。

双击OK按钮,建立OnOK()函数。

    HANDLE hThread;    
    DWORD ThreadID;  
void CThreadDlg::OnOK() 
{
    
// TODO: 
    
    Sleep(
2000);
    MessageBox(
"线程即将运行!","对话框的题目",MB_OK);
    hThread
=CreateThread(     //hThread变量保存线程句柄,我们需要在头文件中添加
        NULL,        
        
0,        
        (LPTHREAD_START_ROUTINE)ThreadFunc, 
//ThreadFunc这个函数,待会我们再创建。    
        NULL,        
        
0,        
        
&ThreadID);    //ThreadID 线程的ID,也需要在头文件中追加

    
//CDialog::OnOK(); 这句是自动生成的,注释掉。
}

当点击OK按钮的时候,就启动线程。

然后就是在线程中实行的函数。这个函数需要放在OnOK前面,否则会出现没有定义的错误。

void ThreadFunc(int int_param)
{    
    CTime time;    
    CString strTime;    
   
 while(TRUE)    
    
{        
        time
=CTime::GetCurrentTime();    //取得现在的时间    
        strTime=time.Format("%H:%M:%S");        
        ::SetDlgItemText(AfxGetMainWnd()
->m_hWnd,IDC_TIME,strTime);    //显示时间    
        Sleep(1000);    //每秒更新一次
    }

}

OK!现在你可以编译运行一下,慢慢欣赏你的成果吧。

 

我们已经实现了我们要做的事情,但是为了让我们的工作看上去更专业些,我们需要润色润色。

我们需要做两件事情。

首先把我们的定义写到头文件中。
第二我们启动了线程,当然我们也必要能够终止线程,否则退出程序,线程还没终止,会有预想不到的后果。

我们在头文件中把定义加上

protected:
    HICON m_hIcon;

    HANDLE hThread;    
//加上
    DWORD ThreadID;   //加上
    volatile BOOL m_bEndTread; // 用于控制线程的终止
    void ThreadFunc(int int_param);  //在这里定义了,就不用非要写在OnOk函数前头了

然后我们把的

while(TRUE

改成

m_bEndTread = FALSE
while(!m_bEndTread)  

让程序退出时,线程结束:双节Cancel按钮,添加OnCancel()函数

void CThreadDlg::OnCancel() 
{
    
// TODO:     
    m_bEndThread = TRUE; //结束线程    

    MessageBox(
"ByeBye","",MB_OKCANCEL);

    CDialog::OnCancel();
}

OK。这样子,我们的作品就有点薘人的味道了。