c ++ - Hvorfor opdateres min dialogboks ikke umiddelbart, når jeg kalder UpdateData (FALSE)?

Indlæg af Hanne Mølgaard Plasc

Problem



Kan nogen fortælle mig hvorfor, der ringer til UpdateData(FALSE), virker det ikke, før jeg ringer en meddelelsesboks i min VC ++ dialogbaserede applikation? Runtime-vinduet forbliver uændret, indtil jeg ringer til:


MessageBoxW(cDisp, L"!!!Data Count!!!", MB\_OK | MB\_ICONINFORMATION)  


En del af min kodestykke er sådan her ...


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+="
";
                                    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()));
       }

    }

Bedste reference


Der er så mange problemer med den kode, at jeg ikke engang er sikker på, hvor jeg skal begynde. For startere:



  1. Hvorfor ringer du Sleep() ?? Jeg kan ikke forestille mig en grund til, at du skulle gøre det i en veldesignet applikation. Specielt ikke gentagne gange, som du har vist i din kode. Funktionen Sleep får din tråd til at blive suspenderet i det angivne antal millisekunder. Prøv at tage opkaldene til Sleep helt og se, om det ikke løser dit problem. Hvis tråden er suspenderet, hvordan skal brugergrænsefladen opdateres?

  2. Hvorfor blander du UpdateData med GetDlgItem og et opkald til SetWindowText? Hvis du 'lader MFC sørge for at koordinere værdierne for dine medlemsvariabler med de værdier, der vises i dialogboksen, skal du ikke selv angive deres egenskaber.



Du viser dig heller ikke nok af din kode for at vide, hvad CDisp1 er, eller hvad IDC\_DISPLAYFILE er. Hvad vil du i sidste ende forsøge at opnå ? Vil du have en reel -opdatering, mens data behandles? Vi kunne helt sikkert yde meget bedre hjælp til, hvordan du strukturerer din kode, hvis vi vidste, hvad målet var, snarere end kun koden, der ikke virker.




Opdatering: Ahh, jeg ser dig. Jeg har lige tilføjet i en kommentar, at ovennævnte kode er i en for loop. Så dit problem er faktisk enkelt: en for loop sætter CPU'en ind i en stram sløjfe, hvor intet andet end din kode bliver udført. All meddelelsesbehandling (især opdatering af brugergrænsefladen) suspenderes, mens din sløjfe udfører det angivne antal gange.


Opkald UpdateData har ikke noget resultat på værdierne af kontrollerne i dialogboksen, fordi din computers processor er optaget looping. Viser en meddelelse boks midlertidigt blokerer udførelsen af ​​din for loop ved at oprette sin egen meddelelsespumpe, som gør det muligt for brugergrænsefladen at blive opdateret. Tag koden ud af for sløjfen, og fjern opkaldene til Sleep, og dine problemer vil gå væk.


Fra kommentarerne ser det ud til, at det bedste, du skal gøre, er at oprette en arbejdstråd og placere din loop der i stedet for at isolere den fra din hoved (GUI) tråd. Arbejdstråd kan så sende en besked til din hovedtråd for at opdatere kontrollerne i dialogboksen. Komplette løsninger og flere oplysninger er allerede givet som svar på dette spørgsmål: Hvordan kan jeg vise en modløs dialog og vise oplysninger i det med det samme?

Andre referencer 1


Sandsynligvis fordi opkaldet til MessageBox indeholder en meddelelsespumpe. Brug af søvn som du gør betyder, at brugergrænsefladen ikke vil være lydhør.