写了一个函数,想完善下,大致如下int i=0;
void CMainFrame::OnXml2mysql(){ ……………………………………
/**********************创建一个额外的线程显示进度条************************/ HANDLE h_handle;
h_handle=CreateThread(NULL,0,ThreadFunc,NULL,0,NULL);
CloseHandle(h_handle);/**************************************************************************/for(i;i<length();i++){
……………………
}
}
如上,我线程 domodal()了一个对话框,里面放了一个进度条控件,我想通过主线程里全局变量i的改变来改变进度条,现在对话框能在for循环前显示出来了,那个进度条该怎么操作,小弟新手,才接触多线程,线程间的通信不是很了解,这个是不是主线程向子线程发送消息,然后子线程接收到消息后就调用CProgressCtrl的setpos(i)方法来改变进度条,是怎么操作的
另外还遇到个问题,这个线程使用的API函数能正确在for循环前就执行线程函数,但是我用MFC里面的AfxBeginThread时,它都是等for循环完了才把对话框显示出来,请问这又是怎么回事额好桑

解决方案 »

  1.   

    最好不要在线程里domodal对话框
      

  2.   

    你用DoModal对话框就是想阻塞界面了,没必要开线程;通过消息机制去通讯好了。比如给对话框传一个CMainFrame实例指针,对话框显示后反过来调用这个实例的函数完成任务,把对话框实例指针传给函数,函数里面完成你的任务,更新对话框显示。注意循环会阻塞窗口消息,要么用消息泵处理一下,要么主动调用UpdateWindow刷新界面。
    对话框构造函数
    CMyDlg(CMainFrmae* pMain)
    : m_pMain(pMain){}
    void CMainFrame::OnXml2mysql(){
        CMyDlg dlg(this);
        dlg.DoModal();
    }
    void CMainFrame::DoSomething(CDialog* pDlg){
        for(...)
        {
            pDlg->SendMessage(...);
        }
    }
    对话框中(OnInitDialog):
    m_pMain->DoSomething(this);
    对话框响应消息,更新进度条,刷新界面