Ich entwerfe derzeit eine Anwendung, die viel Berechnung erfordert. Jetzt habe ich allgemein zwei Möglichkeiten, die ich beide getestet habe:
1) Beim Start der Anwendung habe ich nur die wichtigsten Werte berechnet und diese Werte, die viel Zeit in Anspruch nehmen. Der Benutzer muss also während des Startvorgangs ungefähr 15 Sekunden warten. Andererseits erfordern viele Benutzerinteraktionen eine Neuberechnung, sodass der Benutzer nach dem Klicken häufig 2-3 Sekunden warten muss, bis die Anwendung alle Werte berechnet und geladen hat
2) Ich lade alles beim Start. Dies dauert 90 bis 120 Sekunden ... Dies ist eine ziemlich lange Zeit, aber der große Vorteil ist, dass alle Benutzerinteraktionen sofort ausgeführt werden.
Was würden Sie allgemein als den besseren Ansatz betrachten? Laden Sie alle zeitaufwändigen Vorgänge während des Startvorgangs oder bei Bedarf?
quelle
Antworten:
Starten Sie so schnell wie möglich und verwenden Sie einen Thread, um die wichtigsten Berechnungen durchzuführen. So erhält der Benutzer sofort eine Rückmeldung und kann nach 15 Sekunden mit der Arbeit beginnen. Lassen Sie im Hintergrund einen anderen Thread alles berechnen, sodass nach zwei Minuten auch die Antwortzeiten von 2-3 Sekunden vergehen.
quelle
Verwenden Sie einen separaten Thread von der GUI, um die erforderlichen Berechnungen durchzuführen. Lassen Sie Ihr Formular ein Ereignis abonnieren, und wenn Sie mit der Berechnung des Feuers dieses Ereignisses fertig sind, verhält sich Ihr Formular entsprechend.
Sperren Sie die GUI nicht, sie ist für Endbenutzer sehr, sehr ärgerlich und kann als Zeichen für ein schlechtes Produkt angesehen werden.
Zeigen Sie dem Benutzer in Ihrem Fall so schnell wie möglich etwas an und führen Sie alle Berechnungen im Hintergrund durch.
quelle
Sperren Sie den UI-Thread auf keinen Fall für einen. Haben Sie Feedback, wenn Sie den Benutzer in unvermeidbaren Situationen warten lassen möchten.
Ich würde sagen, dass Sie niemals das "Ganze" von etwas in einer Anwendung berechnen oder abrufen, es sei denn, Sie waren sich absolut sicher, dass sie jedes Mal, wenn sie die Anwendung verwenden, sicher sind, dass sie alle besagten Daten vollständig nutzen.
Es kommt auch darauf an, wie volatil die Daten sind. Wenn es sich kaum ändert, warum müssen Sie es bei jedem Start der Anwendung neu berechnen? Ich bin sicher, dass ein Anwendungsstart nichts Bedeutendes hat. Kann diese Berechnung also zwischengespeichert und nur aktualisiert werden, wenn sich die zugrunde liegenden Werte der Daten ändern?
Das Warten von 1-2 Minuten auf das Laden einer Anwendung kommt in den meisten Situationen nicht in Frage. Wie ich bereits sagte, müssen all diese Daten für alle Funktionen der Anwendung verfügbar sein?
Halten Sie es so reaktionsschnell wie möglich, indem Sie Datenberechnungen nach Bedarf durchführen. Setzen Sie Berechnungen auf Hintergrund-Threads, wenn es sich wirklich immer um global benötigte Daten handelt. Betrachten Sie einige Teile der Daten, die faul geladen / berechnet werden.
Ich glaube nicht, dass das, was Sie angegeben haben, uns helfen kann, Ihnen eine genaue Antwort zu geben, da wir die Art der zugrunde liegenden Daten oder Anwendungsfälle der Anwendung nicht kennen.
quelle
Sie erklären nicht zu viel, was Ihre Bewerbung ist und warum etwas berechnet werden muss, daher ist es schwierig, etwas genau zu beantworten. In allen Fällen haben Sie die Wahl, den Benutzer 15 Sekunden oder 90 Sekunden warten zu lassen . In beiden Fällen liegt ein Problem vor . Jede von mir verwendete Anwendung wurde in weniger als zehn Sekunden geladen, außer unter bestimmten Umständen (z. B. kann Visual Studio beim erstmaligen Laden nach einer Neuinstallation bis zu 30 bis 40 Sekunden dauern).
Im Allgemeinen muss der Benutzer weder beim Start noch während des Workflows warten. Wenn der Start der App 15 Sekunden dauert, versuchen die meisten Benutzer, sie niemals zu schließen oder beim Verlassen zu starten, wenn sie eine Tasse Kaffee trinken. In allen Fällen werden sie wahrscheinlich denken: "Ich sollte mehr in den Kauf einer richtigen Software investieren, anstatt meine kostbare Zeit zu verlieren."
Die Fälle, in denen Sie sofort wirklich viel Berechnung benötigen, sind äußerst selten und können leicht entfernt werden. Beispielsweise muss Adobe Lightroom beim Starten den letzten Katalog mit den Miniaturansichten der Fotos anzeigen. Wenn ich mit einem Katalog beginne, der mehrere Hundert Fotos enthält, 20 MB auf der Festplatte pro Foto , sind viel Festplatte und CPU erforderlich, um diese Fotos zu laden, zu lesen, Transformationen (einschließlich perspektivischer Verzerrungen usw.) durchzuführen und eine Miniaturansicht zu erstellen . Tatsächlich benötigt Lightroom weniger als fünf Sekunden, um auf einen nicht ganz so neuen PC geladen zu werden, da die Daten intelligent zwischengespeichert werden und nicht alle Hunderte von Miniaturansichten unmittelbar nach dem Start angezeigt werden, sondern einzeln das Hauptfenster wird bereits angezeigt.
In Ihrem Fall sollten Sie wahrscheinlich weniger darüber nachdenken, wann der Benutzer warten muss, als vielmehr darüber, wie Sie vermeiden können, dass Ihre Benutzer ihre Zeit verschwenden.
Bearbeiten: Natürlich habe ich eine Gruppe von Anwendungen vergessen, die sich anders verhalten können: Videospiele . In einem Videospiel können Sie den Benutzer eine Minute warten lassen, um Grafiken zu laden. Dies geschieht, weil 2D / 3D-Rendering CPU-intensiv sein kann und Sie es sich nicht leisten können, Maschinenressourcen zu laden, die während des Spiels geladen und berechnet werden: Die visuelle Leistung muss die bestmögliche sein und das Spielerlebnis muss äußerst flüssig sein.
Aber selbst in diesem Fall denke ich, dass diese Anwendungen versuchen, weniger als eine Minute mit dem Laden von Dingen zu verbringen . Oder sie laden kleine Teile , sodass der Benutzer das Spiel sehr schnell starten und reibungslos spielen kann. Warten Sie jedoch bis zu fünf Sekunden, wenn Sie von einem Level zum anderen wechseln (das habe ich zum Beispiel in der Half Life-Serie gesehen).
quelle
Diese Werte müssen Sie berechnen, wie Sie sie verwenden? Möchten Sie sie einfach anzeigen?
Sie erwähnen, dass Sie sie alle auf einmal berechnen können. Können Sie sie nicht irgendwo aufbewahren, damit sie nicht neu berechnet werden müssen?
Wenn dies keine Option ist, würde ich Multithreading verwenden und eine 'berechnende' Animation anzeigen, in der Sie die Werte anzeigen möchten. Sobald die Werte berechnet wurden, können sie angezeigt werden.
Auf diese Weise blockiert die GUI nicht, was äußerst ärgerlich ist. Der Benutzer kann weiterhin abbrechen und zu einem anderen Bildschirm wechseln, usw.
quelle
Können Sie sie nicht so berechnen, wie Sie sie benötigen, und sie dann speichern, damit sie nicht erneut berechnet werden müssen?
Wenn Sie also eine Nummer benötigen, überprüfen Sie, ob sie gespeichert ist. Wenn nicht, berechnen Sie sie und speichern Sie sie.
quelle
Wahrnehmung ist so ziemlich Realität. Das Warten in der Schlange scheint so viel länger zu dauern, als wenn wir tatsächlich Dienstleistungen erbringen. Es liegt in der Natur des Menschen, eine Einstellung zu entwickeln, dass Ihre Anwendung langsam ist (und bei allem, was sie tut, immer langsam ist), wenn wir zu lange warten müssen, bis sie zu Beginn geladen wird.
Brechen Sie die Berechnungen, wenn Sie können. Im Idealfall laufen viele von ihnen im Hintergrund oder werden nach Bedarf ausgeführt.
quelle
Wenn dies meine einzigen beiden Möglichkeiten sind, nehme ich mir die langsame Startzeit. Es macht mir nichts aus, ein bisschen darauf zu warten, dass etwas anfängt, aber ich hasse es, wenn mein System nachlässt, während ich versuche, etwas Arbeit zu erledigen.
Natürlich ist keine Art des Wartens eine gute Benutzererfahrung, und ich stimme Ihren anderen Befragten zu, dass Sie Multithreading untersuchen sollten. Wenn Ihre App fast fertig ist, können Sie Multithreading wahrscheinlich nicht einfach "hinzufügen". Schauen Sie sich also vielleicht die nächste Version an.
quelle