Code zugunsten Form-Aufbau verzögern



  • Hallo,

    um eine rechenintensive Operation (Sortieren einer Tabelle) durch ein Hinweisfeld vor Unterbrechungen zu schützen, würde ich gern eine Form als Hinweis anzeigen.

    Wenn ich aber

    SortinProgressDialog* myDialog = new SortinProgressDialog();
    myDialog->Show();
    startTable = TableSort(startTable);
    myDialog->Close();
    

    verwende, dann wird die Form zwar angezeigt, aber nicht die darin enthaltene Meldung. Grund: sofort nach dem Aufruf "myDialog->Show" beginnt das Sortieren und somit stehen "keine Ressourcen" für das vollständige Aufbauen der Hinweisform mehr zur Verfügung.

    In VB hätte ich jetzt ein kleine DoEvents-Schleife eingefügt:

    dblEndTime = VB.Timer() + 2#
    Do While dblEndTime > VB.Timer()
        System.Windows.Forms.Application.DoEvents()
    Loop
    

    Die verzögert mir die Ausführung des nachfolgenden Codes und das Fenster wird ordentlich aufgebaut. Wie mache ich das jetzt aber mit C++? Geht das da auch mit dem DoEvents(), wenn ja wie?

    Gruß
    physici



  • Hi,

    nimm doch einfach einen Backgroundworker (Komponente im Designer) und lass den Aufbau deiner Tabelle über Multithread im "Hintergrund" passieren. So hab ich das bei einem Updater gemacht. Bei einem Singelthreadprozessor wird zuerst dein Hinweisfenster aufgebaut, der andere Thread wartet, und dann wird der weite Thread ausgeführt. Ausserdem kann der beutzer ja trotzdem dein Fenster Fokussieren, desshalb würde ich das auch noch disabeln (Enabled = false).

    In der MSDN gibts genügend Beispiele für die Komponente (einfach mal suchen).



  • Prinzipiell stelle ich immer wieder fest, das wenn man mit Framwworks wie .NET anfaengt, oft unklar ist, das ein Programm sequenziell ablaeuft.
    Das gilt auch fuer .NET, tieft drunter wird irgendwo die MSG loop betrieben. Wenn du in einer funktion festhaengst, friert dein ganzes programm ein,d.h es reagiert nicht mehr bis die funtkion beendet ist.

    Von dieser Sicht aus wird man NIE aktionen in eine funktion packen, die mehr als einen bruchteil einer sekunde haben, wenn man ein vernuenftig arbeitendes programm schreiben will.

    Deshalb braucht man ja unter anderem auch Multithreading! Ergo alles was lang dauert schickt man in einen eigenen thread und wie schon erwaehnt liefert die .NET framework mit dem Backgroundworker schon eine Threadclasse mit, mit der man alle diese Faelle einfach loesen kann.
    Lang das nicht show mal in Sytem::Threading was da sonst noch so rumfliegt.

    Cheers



  • auf multithreading wollte ich eigentlich nicht zurückgreifen, einfach nur eine kurze Verzögerung einbauen 😞
    In VB hab ich schon mal vor dem gleichen Problem gestanden, da habe ich das mit o.g. Code gelöst. Also kurz mal in eine Zeitschleife geschicht.

    Mal schauen, wie ich das mache.
    gruß
    physici



  • Habe das Problem gelöst!!
    Rufe einfach vor dem Starten des Sortierens die Funktion
    Application::DoEvents()
    auf. Damit klappt es.

    Danke für eure Hilfe


Anmelden zum Antworten