求救了 大侠们 教教我怎么实现这样的功能--主窗口hide但仍在继续运行 同时打开一个进度条现在后面的运行进度...仔细说下: 我现在想在按了button后 打开一个进度条的窗口, 之后继续运行onButton 后面的程序..进度条显示正在后台运行着  当onButton 运行结束 关闭了进度条 窗口。这里 进度条窗口id 为IDD_AAA,类为BBB (俄,懒得改了)我现在这样做,在主窗口的类中  CDlgDlg 声明一个 全局 变量 BBB * dlg
然后把调用进度窗口 写成了线程...UINT   ThreadProc(LPVOID   param)在 onButton 里面 调用,现在的问题是 在 线程调用后 ,如果onButton 继续往后执行的里面如出现AfxMessageBox这样的窗口(使得主窗口失去焦点.),则进度窗口可以完好的显示 进度条也正常工作. 
但是如果让onButton 继续往后执行 一些如sleep 或者处理写数据时 则 进度窗口不显示,如果用ShowWindow();这样的 只能是进度窗口的框架显示 但是进度条空间等不显示...
.....求救阿..代码如下:
主窗口的代码:
BBB* dlg;
UINT   ThreadProc(LPVOID   param)
{ CRect rectDisk;
dlg->GetWindowRect( &rectDisk );
dlg->SetWindowPos( NULL,
0,0,
 rectDisk.Width(),rectDisk.Height(),
 SWP_NOZORDER
 );
dlg->ShowWindow(SW_SHOW);

return 0;
}BOOL CDlgDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // Add "About..." menu item to system menu.......
// TODO: Add extra initialization here
dlg = new BBB (this);
dlg->Create( IDD_AAA, this ); return TRUE;  // return TRUE  unless you set the focus to a control
}//onBtn
void CDlgDlg::OnButton2() 
{
// TODO: Add your control notification handler code here
HWND   hWnd; 
CWinThread* pThread;
hWnd   =   GetSafeHwnd();  

ShowWindow(SW_HIDE);
dlg->SetTimerFlg();
pThread  =AfxBeginThread(ThreadProc,hWnd);
for(int i=0;i<400;i++)
{

    if(i%100 == 0)
    AfxMessageBox("adfdafd");//这样进度条就可以运行 
    //Sleep(2000);           //这样进度条无法运行..
}


        //卸载线程
        DWORD code;
if(GetExitCodeThread(pThread->m_hThread,&code)) 
if(code==STILL_ACTIVE)
{
 
TerminateThread(pThread->m_hThread,0); 
CloseHandle(pThread->m_hThread); 

}
dlg->Close();
Sleep(2000);
dlg->EndDialog(0); ShowWindow(SW_SHOW);
}/**************IDD_AAA  进度条窗口**********/
//BBB.h
#if !defined(AFX_BBB_H__2CF0FB86_9498_46CF_AF06_D66357D13360__INCLUDED_)
#define AFX_BBB_H__2CF0FB86_9498_46CF_AF06_D66357D13360__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// BBB.h : header file
///////////////////////////////////////////////////////////////////////////////
// BBB dialogclass BBB : public CDialog
{
// Construction
public:
void SetTimerFlg();
int TimerFlg;
int proFlg;
void Close();
BBB(CWnd* pParent = NULL);   // standard constructor// Dialog Data
//{{AFX_DATA(BBB)
enum { IDD = IDD_AAA };
CProgressCtrl m_prog;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(BBB)
protected:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
//}}AFX_VIRTUAL// Implementation
protected: // Generated message map functions
//{{AFX_MSG(BBB)
virtual BOOL OnInitDialog();
afx_msg void OnTimer(UINT nIDEvent);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_BBB_H__2CF0FB86_9498_46CF_AF06_D66357D13360__INCLUDED_)/***************************BBB.cpp****************************/BOOL BBB::OnInitDialog()
{
CDialog::OnInitDialog(); // Add "About..." menu item to system menu.......... // TODO: Add extra initialization here proFlg=0;
m_prog.SetRange(0,100);
m_prog.SetStep(1);
m_prog.SetPos(1);
SetTimerFlg();
return TRUE; 
}void BBB::SetTimerFlg()
{
TimerFlg = 0;
SetTimer(1,1,NULL);
}void BBB::OnTimer(UINT nIDEvent) 
{
if(!TimerFlg)
{
m_prog.SetPos(proFlg);
proFlg++;
if(proFlg>=95)
proFlg=30;
CDialog::OnTimer(nIDEvent);
}
}void BBB::Close() 
{
proFlg = 100;
m_prog.SetPos(proFlg);
TimerFlg = 1;
proFlg=0;
KillTimer(1);
}

解决方案 »

  1.   

    你sleep的作用是等待线程结束是不是?是这样的话,不要用sleep,而用waitforsingleobject来等待线程结束,试试看
      

  2.   

    sleep 我在测试 进度运行 而我的主窗口 一样在运行...
      

  3.   

    其实吧,你应该在onbutton这个响应函数里里只起那个后台线程就行,然后在线程里控制进度显示等,不该在起线程之后后面还那么多东西,因为这个函数不执行完,对话框的消息是堵塞的,你试试看,我以前也弄过这玩艺