//进度条的更新函数
int g_Progress = 0;
void CFindFileDlg::RunProgressCtrl()
{
if(m_progress.GetPos() == 0)
{
m_progress.SetRange(0,100);
} static int nStep = 5; if(g_Progress == 0)
{
nStep = 5;
}
else if(g_Progress == 100)
{
nStep = -5;
} g_Progress += nStep;
m_progress.SetPos(g_Progress);
}RefreshList(); //这个函数最终会实现:根据后缀名,查找文件。//“查找” -- 按钮
void CFindFileDlg::OnBnClickedSearchFileByTime()
{
//如何实现:按下“查找”按钮后,进度条不断的向前移动,直到查找所有符合条件的文件才停止移动。
//也就是说,我希望RefreshList()函数和RunProgressCtrl()函数是同时开始,同时结束的!!!
//之前发了帖子问了一下,很多人说用多线程,所以就学了一下多线程,发现有很钟情况,什么临界啊什么的。
//想问有没简单一点的实现方法。
}
public:
static UINT ThreadFunc(LPVOID lpParam);
CWinThread *m_pThread; //.cpp
//“查找” -- 按钮
void CFindFileDlg::OnBnClickedSearchFileByTime()
{
m_pThread = AfxBeginThread(ThreadFunc, &m_progress); //worker线程 RefreshList();
}UINT CFindFileDlg::ThreadFunc( LPVOID lpParam )
{
CProgressCtrl *pCtrl = (CProgressCtrl*)lpParam;
if(pCtrl->GetPos() == 0)
{
pCtrl->SetRange(0,100);
} static int nStep = 5; if(g_Progress == 0)
{
nStep = 5;
}
else if(g_Progress == 100)
{
nStep = -5;
} g_Progress += nStep;
pCtrl->SetPos(g_Progress); return 0;
}这样好像不对,哪里错了啊?
结束进程怎么写啊?
HANDLE Progress_thread;
HANDLE Refresh_thread;
unsigned Progress_threadid;
unsigned Refresh_threadid;
bool bover;实现:
unsigned __stdcall Progress(void *obj)
{
CFindFileDlg *dlg;
dlg = (CFindFileDlg *)obj;
//这里进度条循环显示
//判断bover是否为真就跳出循环
return 0;
}unsigned __stdcall Refresh(void *obj)
{
CFindFileDlg *dlg;
dlg = (CFindFileDlg *)obj;
RefreshList();
dlg->bover=TRUE;
return 0;
}void CFindFileDlg::OnBnClickedSearchFileByTime()
{
Progress_thread = NULL;
Refresh_thread = NULL;
Progress_threadid =0;
Refresh_threadid = 0;
bover = FALSE;
Progress_thread = (HANDLE)_beginthreadex( NULL, 0, Progress , this, 0, &Progress_threadid );
Refresh_thread = (HANDLE)_beginthreadex( NULL, 0, Refresh , this, 0, &Refresh_threadid );
}
bool bTerminated = false;在Progress线程中
while(bTerminated != true)
{
...
}另外,RefreshList()也是耗时过程,建议也放在线程中,在RefreshList执行后设置bTerminated为true
{
CProgressCtrl *pCtrl = (CProgressCtrl*)lpParam; if(pCtrl->GetPos() == 0)
{
pCtrl->SetRange(0,100);
} static int nStep = 5; while(1)
{
if(g_Progress == 0)
{
nStep = 5;
}
else if(g_Progress == 100)
{
nStep = -5;
//不想死循环就加个break
}
g_Progress += nStep;
pCtrl->SetPos(g_Progress);
sleep(1000);
} return 0;
}