Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Aktualisierg. Dialog bei Aufruf ext. Progr. mit WinExec

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
13.02.2008, 08:21 Uhr
pf2



Hallo,

Folgendes Problem:

Mein Programm bearbeitet verschiedene Dateien. Um den Fortschritt kenntlich zumachen, zeige ich die Bearbeiteten in einer Textbox eines Dialoges an. Diesen Dialog starte ich über DoModal().
Das funktioniert erst einmal.
Zwischendurch starte ich mit WinExec() ein externes Programm und warte auf dessen Ergebnis.
Das Ergebnis ist eine bestimmte Datei.
Das klappt auch.
Jetzt geht aber der Ärger los:
Anschließende Abarbeitungen werden nur noch selten angezeigt, obwohl ich den Dialog mit allen möglichen Funktionen aktualisieren:
RedrawWindow(), UpdateWindow(), Invalidate(), BringWindowToTop(), SetActiveWindow().

Für hilfreiche Tipps wäre ich sehr dankbar.

pf2
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.02.2008, 12:49 Uhr
Tommix



Hallo,
"Anschließende Abarbeitungen" ist ein wenig wage, möglicherweise bringt es

C++:
Invalidate();
SendMessage(WM_PAINT);



Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.02.2008, 16:17 Uhr
~pf2
Gast


also,
Invalidate();
SendMessage(WM_PAINT);
hilft auch nicht.

Was heißt ' "Anschließende Abarbeitungen" ist ein wenig wage' ?
Ich möchte nach dem das externe Programm fertig ist noch weitere Informationen in meinem Textfenster anzeigen. Diese werden aber nicht gezeigt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.02.2008, 16:24 Uhr
Tommix



Es gibt verschiedene Möglichkeiten Text anzuzeigen. Wenn Du es ganz MFCisch über Membervariablen machst, darfst du das UpdateData(FALSE) nicht vergessen. Ansonsten zeig' mal etwas Code.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.02.2008, 08:43 Uhr
pf2



Hier mal die Grundzüge des Quellcodes:


Aufruf des Dialog in der Applikationsklasse:


C++:
   BOOL CApp::InitInstance()
    {
        if((pDlg = new CDlg()) != NULL){
        
            pDlg->DoModal();
            delete pDlg;
        }
        return TRUE;
    }




Der Start der Abarbeitung wird in der Dialogklasse angestoßen.:


C++:
    CDlg::OnInitDialog()
    {
        ((CApp*)AfxGetApp())->Start(this);
    }




Der Dialog enthält eine ListBox:

C++:

    CListBox m_lstMessages;





Diese wird von CApp::Start() aus gefüllt über:


C++:
   pDlg->Log(Text)
    mehrmals mit verschiedenen Texten.

    CDlg::Log(char *Text)
    {
        m_lstMessages.AddString(Text);
        this->UpdateData(false);
        this->RedrawWindow();
    }



Wie gesagt funktioniert erst einmal tadellos.

Dann rufen ich in CApp::Start() das externe Programm auf:


C++:
    WinExec(cProgramm,SW_SHOW);




Und warte bis es mir die zuerwartende Datei zurück gibt.

Anschließend arbeitet mein Programm weitere Funktionen ab. (Dateien erstellen, kopieren).
Dieses möchte ich wieder dokumentieren indem ich mit


C++:
    pDlg->Log(Text)




in die Textbox des Dialog schreibe.
Da der Dialog nicht aktualisiert wurde habe ich jeweils noch alle möglichen Dialogfunktionen hintergeschickt:


C++:
CApp::ReDrawDlg(CDlg *pDlg)
{
    pDlg->Invalidate();
    pDlg->UpdateWindow();
    pDlg->RedrawWindow();
    pDlg->ShowWindow(SW_SHOW);
    pDlg->BringWindowToTop();
    pDlg->SetActiveWindow();
    pDlg->SetFocus();
}



Ohne Erfolg.

Die Abarbeitungsfunktion in der App-Klasse sieht in Kurzform so aus.

C++:
CApp::Start(CDlg *pDlg)
{
    Funktion1();
    pDlg->Log(textErgebnis1);

    Funktion2();
    pDlg->Log(textErgebnis2);

    WinExec(cProgramm,SW_SHOW);
    WaitForResult();

    Funktion3();
    pDlg->Log(textErgebnis3);
    pDlg->ReDrawDlg

    Funktion4();
    pDlg->Log(textErgebnis4);
    pDlg->ReDrawDlg
}




pf2

Dieser Post wurde am 18.02.2008 um 13:32 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
17.02.2008, 15:31 Uhr
Tommix



Hallo,
ich denke mal das es hier klemmt:

Zitat:

Und warte bis es mir die zuerwartende Datei zurück gibt.


Zumindest sehe ich in dem was Du gepostet hast keinen Fehler.

Gruß Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.02.2008, 13:09 Uhr
pf2



Hallo,

auch wenn ich nicht warte, das Ergebnis bleibt trotzdem das gleiche.

Trotzdem danke für die Mühe.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
18.02.2008, 13:33 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja, du rufst deine Funktion ja nicht in einem neuen Thread auf, sondern im Hauptprozess, d.h dein Dialog kann dir nichts anzeigen, weil er erst nach der Abarbeitung der Funktion überhaupt erstmal wieder die window-nachrichten verarbeitet.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: