Ausführung einer Methode vom User abbrechen lassen - wie?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ausführung einer Methode vom User abbrechen lassen - wie?

    Hallo, ich brauch mal wieder Eure Hilfe!

    Ich möchte, dass der User eine längere mathematische Berechnung (Kürzen von Brüchen) durch Drücken von Esc oder Command-. abbrechen kann. Wie geht das am einfachsten? Command-Alt-Esc ist keine Alternative, das Programm soll ja weiter laufen.

    Für Ideen herzlichen Dank!
  • Längere Berechnungen sollten ja ohnehin nicht auf dem Hauptthread laufen, da bietet es sich an, sie in eine NSOperation zu packen. Der NSOperation kann man dann ein -cancel schicken, innerhalb der Berechnung -isCancelled abfragen und ggf. abbrechen. Aber was sind das denn für riesige Brüche? Alles Haushaltsübliche sollte sich innerhalb weniger Millisekunden kürzen lassen.
    Multigrad - 360°-Produktfotografie für den Mac
  • Danke schon mal an alle!

    @Mattik:
    Aber was sind das denn für riesige Brüche? Alles Haushaltsübliche sollte sich innerhalb weniger Millisekunden kürzen lassen.

    Beim Lösen von Gleichungssystemen mit vielen Variablen ist es unwahrscheinlich, dass es beim Haushaltsüblichen bleibt. Und bei wenigen Variablen ist das Rechnen und die Darstellung mit Brüchen anstatt Dezimalzahlen angenehmer zu lesen; und von der Genauigkeit unschlagbar. - NSOperation muss ich mir mal ansehen.

    @MCDan:
    Eine Möglichkeit wäre ein Fortschrittsdialog mit Abbrechen Button.​

    Scheint mir das einfachste zu sein. Hätte ich auch drauf kommen können! :/

    Ich dachte, es müsste einfacher sein, nur mal eben die Tastatur abzufragen. Vielleicht ist das aber auch die verkehrte Denkweise von früher!?

    Gruß Axel
  • axbe schrieb:

    Und bei wenigen Variablen ist das Rechnen und die Darstellung mit Brüchen anstatt Dezimalzahlen angenehmer zu lesen; und von der Genauigkeit unschlagbar.

    Da bekommst Du auch bei kleinen Tabellen schnell große Brüche mit teilerfremden Zählern und Nennern. Die sind dann auch nicht sehr leserlich. Welchen Datentyp verwendest Du für die Berechnung?

    Wozu brauchst Du die Exaktheit?
    „Meine Komplikation hatte eine Komplikation.“
  • @macmoonshine:
    Da bekommst Du auch bei kleinen Tabellen schnell große Brüche mit teilerfremden Zählern und Nennern. Die sind dann auch nicht sehr leserlich. Welchen Datentyp verwendest Du für die Berechnung?

    Wozu brauchst Du die Exaktheit?​


    Im Prinzip hast Du ja recht, aber in vielen Beispielen für Ausbildungszwecke wird mit Brüchen gerechnet; und ⅓ sieht auch besser aus als 0,33333. Deswegen will ich prinzipiell mit Brüchen rechnen. Ich verwende jeweils ein int für Zähler und Nenner, muss dann aber kürzen. Falls das zu lange dauert, soll der Benutzer eben abbrechen können und mit Dezimalzahlen weiter rechnen. Dafür nehme ich dann double.
  • axbe schrieb:


    @MCDan:
    Eine Möglichkeit wäre ein Fortschrittsdialog mit Abbrechen Button.​

    Scheint mir das einfachste zu sein. Hätte ich auch drauf kommen können! :/

    Ich dachte, es müsste einfacher sein, nur mal eben die Tastatur abzufragen. Vielleicht ist das aber auch die verkehrte Denkweise von früher!?

    Jepp, das UI von OS X ist Event-Driven, da passt eine direkte Abfrage der Tastatur nicht so gut rein.

    Es hängt natürlich davon ab, wie Deine App aufgebaut und zu bedienen ist. Wenn Du keinen modalen Dialog, also z.B. ein Sheet verwendest, um das restliche UI während der Berechnung zu sperren, dann könnte der Anwender natürlich Änderungen vornehmen oder sogar die Berechnung erneut starten, welche dann ggf. parallel zur aktuellen Berechnung läuft. Ja nach Aufbau der App und des Workflows der App bieten sich halt verschiedene Lösungen an. Du kannst z.B.

    A) Das restliche UI während der Berechnung z.B. durch ein modales Sheet, mit Fortschrittsanzeige und Abbrechen Button, sperren oder
    B) Die komplette Berechnung an ein neues Fenster übergeben und das eigentliche UI für die Erfassung einer neuen Berechnung freigeben

    Der Fortschrittsdialog mit Abbrechen Button ist sicherlich die einfachste Lösung.

    Ich kann mir ehrlich gesagt aber nicht vorstellen, wie eine Formel mit Brüchen aussehen muss, bei welcher für die Berechnung ein Fortschrittsdialog erforderlich wäre. Hast Du mal ein konkretes Beispiel, bei dem die Berechnung mehr als 1-2 Sekunden dauert?
  • zerm schrieb:

    Aber wie kann das zulange dauern? GCD ist in etwa quadratisch mit der Anzahl der Ziffern - das klingt für mich so, als ob Du wirklich extrem viele, gigantische Brüche brauchst, damit das kürzen tatsächlich lange braucht?!

    Naja, die Koeffizienten kannst Du mit n * max(A) abschätzen, GCD und Division brauchen damit ca. (n * max(A))^2 Schritte. Für die gesamte Matrix bist Du dann bei n^4 * max(A)^2 Schritten; also O(n^6) wenn die maximale Koeffizientengröße in O(n) liegt. Du kannst natürlich da noch ein bisschen was bei der Multiplikation rausholen, aber das sind Peanuts.

    @axbe: Bei größeren Matrizen bekommst Du schnell in einen Bereich, wo Du Integer-Überläufe bekommst.
    „Meine Komplikation hatte eine Komplikation.“
  • Habe ich auch schon dran gedacht. Wenn Du die Inverse über die Adjungierte berechnest, ist der Nenner des ungekürzten Bruchs immer die Determinante. Dann bräuchtest Du nur eine Zerlegung, hast dafür aber wahrscheinlich größere Koeffizienten während der Berechnung.

    Andererseits wirst Du es schwer haben, mit der Zerlegung schneller als die GCD-Berechnung zu sein.
    „Meine Komplikation hatte eine Komplikation.“
  • gritsch schrieb:

    Übrignes weil Freitag ist: Chuck Norris hat schon bis gezählt - zwei mal!

    Er hat übrigens beide Male bei -∞ begonnen, nech.

    (Und der Replacement Character war Absicht. ^^)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P