我在主线程中用CreateProcess调用一个子进程,然后另开一线程非模式进度条对话框来显示子进程的进度,我在线程函数UINT ThreadFunc(LPVOID lpParam)中打开进度条对话框,在对话框的:OnInitDialog()函数中用SetTimer来控制进度,结果是进度条对话框一闪而过,而主线程运行正常。何故?

解决方案 »

  1.   

    //线程函数
    UINT ThreadFunc(LPVOID lpParam)
    {
    CWaitDlg *dlg = new CWaitDlg;
    dlg->Create(IDD_WAIT_DIALOG);
    dlg->ShowWindow(SW_SHOW);
    dlg->UpdateWindow();  

    return 0;
    }//进度条初始化
    BOOL CWaitDlg::OnInitDialog() 
    {
    CDialog::OnInitDialog();

    // TODO: Add extra initialization here
    m_ctrlProcess.SetRange(0,100);
    m_ctrlProcess.SetPos(0);
    m_ctrlProcess.SetStep(10);
    UpdateData(FALSE);        SetTimer(1,1000,NULL);    

    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
    }
    //在创建子进程前创建子线程
     AfxBeginThread(ThreadFunc,&Info);
       ......
      create=CreateProcess(...);
      

  2.   


    UINT   ThreadFunc(LPVOID   lpParam) 

      CWaitDlg   *dlg   =   new   CWaitDlg; 
      dlg-> Create(IDD_WAIT_DIALOG); 
      dlg-> ShowWindow(SW_SHOW); 
      dlg-> UpdateWindow();       MSG msg;
      while(GetMessage(&msg))
      {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }  return   0; 
    } void CWaitDlg::PostNcDestroy()
    {
      delete this;
      PostQuitMessage(0);
    }
      

  3.   

    GetMessage(&msg, NULL, 0, 0) 上面的代码写错了一句
      

  4.   

    还是自己自定义个消息,用postmessage吧,然后自己处理这个消息。我一直这样用,没出过问题。
      

  5.   

    加入这一段解决了一闪而过的问题,虽然不知道为什么。
    MSG msg;
    while(GetMessage(&msg,   NULL,   0,   0) )
    {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
    }但是出现了新的情况,要等主线程运行完了才运行子线程,为什么它们的优先级一样却不同步?
      

  6.   

    我要让子线程的进度条同步显示主线程的进度,我在用AfxBeginThread创建子线程的时候设置的优先级是THREAD_PRIORITY_NORMAL(换成THREAD_PRIORITY_HIGHEST也没用),情况是主线程运行完了进度条对话框才打开,这样这个对话框留着白用。怎么可以让它们同时运行?