Screen->Cursor bei längerdauernden Prozessen



  • Hab in meiner Grafikanwendung für jede Situation den passenden Cursor eingerichtet. Nur eine Situation kann ich (noch) nicht erfassen: Längerdauernde Prozesse.

    Was länger dauert, ist objectabhängig. Ob Zoom, Graustufen, Bild drehen... egal. Bei einem 100KB-Bild kein Problem. Bei 10 MB dauert halt alles "etwas" länger.

    Nun ist mir nicht klar, wie ich da ansetzen soll. Ist es nötig, jede Operation zu betrachten oder geht das auch global? Wie erfass ich dann überhaupt die Auslastung/Auslastungsdauer?



  • Solche rechnereien werden grundsätzlich in Threads verlagert.. da kannst du den Status ja ohne Probleme abfragen.

    -junix



  • Setz den Cursor vor jeder potentiell länger dauernden Aktion auf crHourGlass und nach Abschluss der Aktion wieder zurück. Wo ist das Problem?



  • Au ja, geht einwandfrei, @Jansen. 🕶 Das allgemeine MouseMove wird während dem Thread nicht ausgewertet. Damit ist es nur eine Zeile je potentielle Function - also definitiv überhaupt kein Problem. 🙂

    @Junux, die Threads sind tatsächlich noch die große Bildungslücke. Mal vage was gelesen zu haben, reicht nicht. Da du von Threads sprichst, wird es wohl keinen globalen Einhakpunkt geben. Das wär halt nur die vage Hoffnung gewesen. Max in dem Fall nix, ist ja je Function nur ein Einzeiler. :p

    Dank euch sehr. Das war wieder ein Schritt in Richtung "saubere Umwelt". :p



  • Original erstellt von <Omega-X>:
    ist ja je Function nur ein Einzeiler

    Eigentlich ja mindestens ein zwei-Zeiler (setzen/rücksetzen).

    Ausserdem musst du dafür sorgen, das auch bei einem eventuellen unerwarteten Abbruch der aufgerufenen Funktion der Cursor wieder zurückgesetzt wird. Also immer schön tryen und catchen. 😉



  • vlei noch ein Applcation->ProcessMessages() hinter dem setzen, damit der auch sofort angezeigt wird.



  • Oha... sieht verdächtig nach *Volltreffer* aus, @Sunday, ich dank dir. Hier soll ich's prohpylactisch einbauen, obwöhl es momentan UFB klappt. Aber du erinnerst dich sicher an das "Kuriosum" mit dem OnCloseQuery? Hab inzwischen noch mehr solche Punkte. Ich setz dort zusätzliche Anweisungen, die ich gar nicht brauch, dann klappt es.

    Ich arbeite sehr viel mit zentralen Steuer- und Meldefunktionen. Da wird wohl nicht immer sichergestellt sein, daß wirklich alles immer gleich ausgewertet wird. Applcation->ProcessMessages(), das sollte mehr bringen als nur den Versuch. Werd sofort drangehen.

    @Jansen, wegen der zentralen Funktionen ist hiert tatsächlich nur ein Einzeiler nötig, kein casten. 🙂 Alle sichtbaren Controls fragen in ihrem OnMouseMove die "Zentrale" nach dem Screen->Cursor ab. Die Zentrale schaut einfach auf die Checksituation, im Falle der Farbpipette auf die Tagvariable des Buttons. Der angelaufene Thread läßt dann keine Überprüfung mehr zu/durch. Ist der Prozess beendet, ist irgendeins der OnMouseMove das aktuell arbeitende Ereignis. Es prüft pflichtgemäß, ich bekomm sofort meinen richtigen Cursor.


Anmelden zum Antworten