MFC多线程的进度条设计

来源:互联网 发布:启航营销软件 编辑:程序博客网 时间:2024/05/16 06:42

1、很多繁重的任务新建一个线程来做,然后可以做一个worker线程,然后worker来做操作同时来设置主线程的模态对话框的显示。

UINT ProcessDlgFunc(LPVOID in){    if(!in)    {        return 100;    }    Sleep(3000);    ProcessDlg *dlg = (ProcessDlg *)in;    int count = 0;    while(count++ <= 100)    {        dlg->PostMessageW(WM_PROCESS, count);        Sleep(500);    }    dlg->PostMessageW(WM_QUIT);    return 200;}void CMFCApplication2View::OnEdit32771(){    // TODO: Add your command handler code here    AfxBeginThread(ProcessDlgFunc, dlg);    dlg->DoModal();}


这里新线程要做个工作就是,先在domodel之前起来,然后等对话框完成domodel,找个只是一个很粗糙的设计,然后新线程定时给对话框post消息来设置进度,多疑对话框也要完成消息处理:

#define WM_PROCESS (WM_USER + 200)class ProcessDlg : public CDialogEx{DECLARE_DYNAMIC(ProcessDlg)public:ProcessDlg(CWnd* pParent = NULL);   // standard constructorvirtual ~ProcessDlg();// Dialog Dataenum { IDD = IDD_DIALOG1 };protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV supportDECLARE_MESSAGE_MAP()public:    CProgressCtrl m_Process;    virtual BOOL OnInitDialog();    afx_msg LRESULT do_process(WPARAM wParam,LPARAM lParam)  ;//    afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);};IMPLEMENT_DYNAMIC(ProcessDlg, CDialogEx)ProcessDlg::ProcessDlg(CWnd* pParent /*=NULL*/): CDialogEx(ProcessDlg::IDD, pParent){}ProcessDlg::~ProcessDlg(){}void ProcessDlg::DoDataExchange(CDataExchange* pDX){    CDialogEx::DoDataExchange(pDX);    DDX_Control(pDX, IDC_PROGRESS1, m_Process);}BEGIN_MESSAGE_MAP(ProcessDlg, CDialogEx)//    ON_WM_DRAWITEM()    ON_MESSAGE(WM_PROCESS, do_process)END_MESSAGE_MAP()LRESULT ProcessDlg::do_process(WPARAM wParam,LPARAM lParam)  {          //AfxMessageBox(_T("test"));      if(wParam >= 0 && wParam <= 100)        m_Process.SetPos(wParam);    return 0;}  // ProcessDlg message handlersBOOL ProcessDlg::OnInitDialog(){    CDialogEx::OnInitDialog();    // TODO:  Add extra initialization here    m_Process.SetRange(0, 100);    m_Process.SetStep(1);    return TRUE;  // return TRUE unless you set the focus to a control    // EXCEPTION: OCX Property Pages should return FALSE}


2、这种方法并不发消息,而是主备线程之间通过一个全局的值,比如整数,主线程用一个定时器轮训这个值,来设置进度条的进度,而新线程就负责完成后台任务和设置进度给共享值,也是可行的。

原创粉丝点击