多线程显示进度条,子线程耗时10s,主线程在这10s中不停的刷新、显示,进度条界面。

来源:互联网 发布:java去掉字母和数字 编辑:程序博客网 时间:2024/06/06 01:05
进度条的进度创建两个新的线程控制,当单击“按钮时”,就创建两个个线程,一个线程用来耗时10s,一个线程耗时10s内,设置进度条的位置,通过改变进度条的位置,让主线程在这10s内不停的更新、显示进度条。


步骤如下:
(1)在资源视图中,拖入进度条控件。
  设置进度条控件相关的变量 m_progress
   在头文件中
   声明线程函数
 static DWORD WINAPI  ThreadSpeed(LPVOID lpParameter);
 static DWORD WINAPI  ThreadSpeed1(LPVOID lpParameter);
(2)按按钮中新创建两个线程
 void CprogressctrolDlg::OnBnClickedOk()
{
CreateThread(NULL,0,ThreadSpeed1,NULL,0,NULL); //创建线程
     CreateThread(0,0,ThreadSpeed,&m_progress,0,0); //创建线程 //
  }
第二个创建的线程的函数第四个参数,线程传入参数,传入的是一个与控件关联的变量的地址。这个参数到后面定义线程的起始函数时,要用到。


线程函数实现如下:
DWORD WINAPI CprogressctrolDlg::ThreadSpeed(LPVOID lpParameter)  


{  
 CProgressCtrl *Speed = (CProgressCtrl*)lpParameter;  
    Speed->SetRange(0,100 )
while(1)
{
      CTime t =CTime::GetCurrentTime();
 s1=t.GetSecond(); 
       if(s1<s)
  s1+=59;
  s2=s1-s;
 if(s2>10)
 break;

      Speed->SetPos(s2*10);
}
return 0;  
}


}


DWORD WINAPI CprogressctrolDlg::ThreadSpeed1(LPVOID lp
Parameter)  
{  


 CTime t =CTime::GetCurrentTime();
   s=t.GetSecond(); 
   Sleep(1000);
   return 0;  
}


总结:
ThreadSpeed1函数,得到当前的系统时间后延时10s。把当前的系统时间秒数保存在,全局变量s中。
ThreadSpeed函数,不停的循环,首先得到当前的系统时间,保存到全局变量s1中,当s1<s,时,加59秒,s1-s的值赋值给全局变量s2,在循环总,10s内设置进度条的位置,如果s2大于10s,结束本次循环。在这个函数设置进度条,相当于改变了主线程进度条控件,主线程便会不停的更新显示进度条。


创建线程 CreateThread(0,0,ThreadSpeed,&m_progress,0,0); 时传入的参数,&m_progress,这个参数会传递给线程函数,这里传递的是一个控件变量的地址,是应为我们要对控件进行操作,然主线程改变控件的显示。   


线程函数声明为类的静态函数的原因:如果不是静态函数,调用时需要定义一个对象,有对象才能调用该函数。这里定义为类的静态函数,因为静态函数不属于任何对象,可以直接调用,也可以将线程函数定义为一个全局变量。
0 0
原创粉丝点击