Почему мое диалоговое окно не обновляется сразу же после вызова UpdateData (FALSE)? - PullRequest
0 голосов
/ 17 февраля 2011

Может кто-нибудь сказать мне, почему вызов UpdateData(FALSE) не работает, пока я не вызову окно сообщения в моем приложении на основе диалогов VC ++?Окно времени выполнения остается неизменным до тех пор, пока я не позвоню:

MessageBoxW(cDisp, L"!!!Data Count!!!", MB_OK | MB_ICONINFORMATION)  

Часть моего фрагмента кода выглядит следующим образом ...

for(int j=0;j<50;j++)
        {


              if(ferr==0)
                {
                    double X[15][4],splusn[15],m_dBiasC,WOld[1][4],alpha,err,WNew[1][4],y[15][1],WTransOld[4][1];

                    //do
                    // {
                            int iGraphX,iGraphY;
                            CString cDisp1(""),cDisp;
                            m_dBiasC=m_dC;
                            err=m_dError;
                            alpha=m_dAlpha;
                            char ch;
                            double dummy1,dummy2;
                            cDisp.Format(L"%d",j);
                                m_sCount.Format(L"%d",m_iInterval);
                                UpdateData(FALSE);
                                BeginWaitCursor();
                            for(int i=0;i<15;i++)
                                {
                                    f[0]>>dummy1>>ch>>dummy2;
                                    Time[i]=dummy1;
                                    m_dAccX[i]=dummy2;
                                    if(!f[0].good())
                                        {
                                            MessageBox(L"The end of first data file encountered",L"Caution");
                                            MessageBoxW(L"Quiting Program ",L"Caution");
                                            ferr=2;
                                            //break;
                                            exit(1);
                                        }
                                    iGraphX=static_cast<int>(Time[i]*100.0);
                                    iGraphY=static_cast<int>(m_dAccX[i]);
                                    m_Graph[0].RemovePoint(0,0);
                                    m_Graph[0].AddPoint(iGraphX,iGraphY);
                                    cDisp.Format(L"%lf  %lf",Time[i],m_dAccX[i]);
                                    cDisp1+=cDisp;
                                    cDisp1+="\r\n";
                                    f[1]>>dummy1>>ch>>dummy2;
                                    Time[i]=dummy1;
                                    m_dAccY[i]=dummy2;
                                    if(!f[1].good())
                                        {
                                            MessageBox(L"The end of second data file encountered",L"Caution");
                                            MessageBoxW(L"Quiting Program ",L"Caution");
                                            ferr=3;
                                            //break;
                                            exit(1);
                                        }
                                    iGraphX=static_cast<int>(Time[i]*50.0);
                                    iGraphY=static_cast<int>(m_dAccY[i]*10);
                                    m_Graph[1].RemovePoint(0,0);
                                    m_Graph[1].AddPoint(iGraphX,iGraphY);

                                    f[2]>>dummy1>>ch>>dummy2;
                                    Time[i]=dummy1;
                                    m_dAccZ[i]=dummy2;
                                    if(!f[2].good())
                                        {
                                            MessageBox(L"The end of third data file encountered",L"Caution");
                                            MessageBoxW(L"Quiting Program ",L"Caution");
                                            ferr=4;
                                            //break;
                                            exit(1);
                                        }
                                    iGraphX=static_cast<int>(Time[i]*50.0);
                                    iGraphY=static_cast<int>(m_dAccZ[i]);
                                    m_Graph[2].RemovePoint(0,0);
                                    m_Graph[2].AddPoint(iGraphX,iGraphY);
                                    f[3]>>dummy1>>ch>>dummy2;
                                    Time[i]=dummy1;
                                    m_dECG[i]=dummy2;
                                    if(!f[3].good())
                                        {
                                            MessageBox(L"The end of fourth data file encountered",L"Caution");
                                            MessageBoxW(L"Quiting Program ",L"Caution");
                                            ferr=5;
                                            //break;
                                            exit(1);
                                        }
                                    iGraphX=static_cast<int>(Time[i]*100.0);
                                    iGraphY=static_cast<int>(m_dECG[i]*100);
                                    m_Graph[3].RemovePoint(0,0);
                                    m_Graph[3].AddPoint(iGraphX,iGraphY);
                                }
                            Sleep(500);
                            GetDlgItem(IDC_DISPLAYFILE)->SetWindowTextW(cDisp1);
                            UpdateData(FALSE);
                            EndWaitCursor();
                            cDisp.Format(L"Data Read till now: %d",((j+1)*15));
                            MessageBox(cDisp,L"!!!Data Count!!!",MB_OK|MB_ICONINFORMATION);
                            UpdateData(FALSE);
                            //This part is for adaptive filter calculations

                            for(int r=0;r<15;r++)
                                {
                                    splusn[r]=static_cast<double>(m_dECG[r]);
                                    X[r][0]=m_dBiasC;
                                    X[r][1]=static_cast<double>(m_dAccX[r]*m_dScaleX);
                                    X[r][2]=static_cast<double>(m_dAccY[r]*m_dScaleY);
                                    X[r][3]=static_cast<double>(m_dAccZ[r]*m_dScaleZ);      
                                }
                            WOld[0][0]=m_dW0;
                            WOld[0][1]=m_dW1;
                            WOld[0][2]=m_dW2;
                            WOld[0][3]=m_dW3;
                            for(int q=0;q<4;q++)
                                WNew[0][q]=WOld[0][q];
                            for(int p=0;p<15;p++)
                                {
                                    for(int iRectCnt=0;iRectCnt<60;iRectCnt++)
                                        {
                                            f[4]<<setiosflags(ios::fixed)<<setw(8)<<setprecision(4)<<p<<"       ";
                                            for(int iWCnt=0;iWCnt<4;iWCnt++) 
                                                f[4]<<setw(8)<<setprecision(2)<<WOld[0][iWCnt];
                                            f[4]<<endl;
                                            y[p][0]=0.0;
                                            for(int q=0;q<4;q++)
                                                WTransOld[q][0]=WOld[0][q];
                                            for(int r=0;r<4;r++)
                                            {
                                                y[p][0]=y[p][0]+(X[p][r]*WTransOld[r][0]);
                                            }
                                            err=splusn[p]-y[p][0];
                                            for(int q=0;q<4;q++)
                                                WNew[0][q]=WOld[0][q]+(2.0*alpha*err*X[p][q]);
                                            for(int q=0;q<4;q++)
                                                WOld[0][q]=WNew[0][q];
                                         }
                                    cDisp.Format(L"%lf",err);
                                    GetDlgItem(IDC_ERROR)->SetWindowTextW(cDisp);
                                    splusn[p]=splusn[p]-err;
                                 }
                            for(int p=0;p<15;p++)
                            {
                                iGraphX=static_cast<int>(Time[p]*100.0);
                                iGraphY=static_cast<int>(splusn[p]*100);
                                m_Graph[4].RemovePoint(0,0);
                                m_Graph[4].AddPoint(iGraphX,iGraphY);
                            }
                            cDisp.Format(L"%lf",WNew[0][0]);
                            GetDlgItem(IDC_W0C)->SetWindowTextW(cDisp);
                            cDisp.Format(L"%lf",WNew[0][1]);
                            GetDlgItem(IDC_W1C)->SetWindowTextW(cDisp);
                            cDisp.Format(L"%lf",WNew[0][2]);
                            GetDlgItem(IDC_W2C)->SetWindowTextW(cDisp);
                            cDisp.Format(L"%lf",WNew[0][3]);
                            GetDlgItem(IDC_W3C)->SetWindowTextW(cDisp);
                            m_sCount.Format(L"%d",0);


                            // End of Adaptive filter 
                            //close files here if already end of file is encountered
                            if((f[0].eof()||f[1].eof()||f[2].eof()||f[3].eof()))
                            {
                                MessageBox(L"End of File encountered");
                                ferr=1;
                                exit(1);
                            }


                     //}while(!(f[0].eof())&&!(f[1].eof())&&!(f[2].eof())&&!(f[3].eof()));
       }

    }

Ответы [ 2 ]

4 голосов
/ 17 февраля 2011

С этим кодом так много проблем, что я даже не знаю, с чего начать. Для начала:

  1. Почему вы звоните Sleep() ?? Я не могу представить причину, по которой вам нужно было бы сделать это в хорошо разработанном приложении. Особенно не многократно, как вы показали в своем коде. Функция Sleep вызывает приостановку вашего потока на указанное количество миллисекунд. Попробуйте вообще принять звонки на Sleep и посмотрите, не решит ли это вашу проблему. Если поток приостановлен, как пользовательский интерфейс будет обновляться?

  2. Почему вы смешиваете UpdateData с GetDlgItem и звоните на SetWindowText? Если вы позволяете MFC позаботиться о согласовании значений переменных-членов со значениями, отображаемыми в элементах управления диалогового окна, вам не нужно устанавливать их свойства самостоятельно.

Вы также не показываете нам достаточно своего кода, чтобы знать, что такое CDisp1 или IDC_DISPLAYFILE. Что вы в конечном итоге пытаетесь достичь ? Хотите обновить в режиме реального времени, пока данные обрабатываются? Конечно, мы могли бы предоставить гораздо лучшую справку о том, как структурировать ваш код, если бы знали, какова цель, а не просто код, который не работает.


Обновление: Ах, я вижу, вы только что добавили в комментарий, что приведенный выше код находится в цикле for. Таким образом, ваша проблема на самом деле проста: цикл for помещает процессор в узкий цикл, где выполняется только ваш код. Вся обработка сообщений (в частности, обновление пользовательского интерфейса) приостанавливается, пока ваш цикл выполняется указанное количество раз.

Вызов UpdateData не оказывает никакого влияния на значения элементов управления в диалоговом окне, потому что процессор вашего компьютера в данный момент занят зацикливанием. Отображение окна сообщения временно блокирует выполнение вашего цикла for, создав собственный насос сообщений, который позволяет обновлять пользовательский интерфейс. Выньте код из цикла for и удалите вызовы на Sleep, и ваши проблемы исчезнут.

Судя по комментариям, лучше всего создать рабочий поток и вместо этого поместить туда свой цикл, изолировав его от основного потока (GUI). Затем рабочий поток может отправить сообщение в ваш основной поток, чтобы обновить элементы управления в диалоговом окне. В качестве ответов на этот вопрос уже были предоставлены полные решения и дополнительная информация: Как я могу показать немодальное диалоговое окно и немедленно отобразить в нем информацию?

0 голосов
/ 17 февраля 2011

Возможно, потому что вызов MessageBox содержит насос сообщений.Использование Sleep во время работы означает, что пользовательский интерфейс не будет отзывчивым.

...