it-swarm.com.de

Wann Benutzerdaten festgeschrieben werden sollen (eine bescheidene Anfrage von einem Systemtechniker ...)

Ich bin also ein Systemprogrammierer, der an einer Benutzeroberfläche arbeitet (vielleicht eine schlechte Idee, aber ich denke, ich mache alles in Ordnung). Wie auch immer, mein Programm ist eine Schnittstelle zu einem Dienst, der auf einem Remotecomputer ausgeführt wird, der eine Hardware steuert. Das Grundmodell ist:

  1. Befehl über die Benutzeroberfläche senden.
  2. Holen Sie sich ACK vom Remote-Service und wechseln Sie in den Besetztzustand.
  3. Remote-Service verarbeitet Anforderungen und sendet OK oder ERROR.
  4. Die Benutzeroberfläche empfängt eine Antwort und verlässt den Besetztzustand.

Wenn die Benutzeroberfläche in einen Besetztzustand versetzt wird, sind alle Steuerelemente deaktiviert (alle bis auf eine, ich werde dies in Kürze erklären, da dies Teil des Problems ist). Ein Aspekt des Systems besteht darin, einem Objekt beliebige Daten zuzuweisen (Daten sind eine Zeichenfolge, Objekt ist für die Zwecke dieser Frage irrelevant). Um diesen Vorgang robust und einfach zu gestalten, werden die Daten an den Remote-Server übertragen, wenn der Benutzer im Textbereich die Eingabetaste drückt oder der Fokus den Textbereich verlässt.

Dies verursacht jedoch ein kleines Problem. Eine Schaltfläche in der Benutzeroberfläche befindet sich immer in einem von zwei Zuständen. "Start" oder "Stopp". Wenn das System beschäftigt ist, wird diese Schaltfläche zu einer Stopp-Schaltfläche und ist die einzige aktivierte Steuerung in der Benutzeroberfläche. Dies ist erforderlich, um lang laufende Vorgänge abzubrechen.

Stellen Sie sich jedoch das folgende Szenario vor:

  1. Der Benutzer gibt in den Textbereich ein, um einem Objekt Daten zuzuweisen, drückt jedoch nicht die Eingabetaste, um ein Commit durchzuführen.
  2. Benutzer drückt die "Start" -Taste.
  3. Da der Textbereich jetzt den Fokus verloren hat, werden die Daten festgeschrieben. Dies führt dazu, dass das System in einen besetzten Zustand versetzt wird.
  4. Nachdem die Daten gesendet wurden und wir uns in einem Besetztzustand befinden, wird der Klick-Handler für die Start/Stopp-Schaltfläche aufgerufen. Die Schaltfläche befindet sich jetzt jedoch im Stoppzustand, da wir die Daten gesendet haben, als der Textbereich den Fokus verlor und wir noch keine OK-Antwort erhalten haben.

Wenn der Benutzer erneut auf Start klickt, ist alles in Ordnung, da die Benutzeroberfläche keine doppelten Daten festschreibt, sondern nur festschreibt, wenn sie geändert wurden. Dies ist jedoch ein Fehler und ich muss ihn beheben.

Ich möchte das Commit bei verlorenem Fokus nicht loswerden, da dadurch sichergestellt wird, dass die Daten auf dem Bildschirm immer festgeschrieben und gültig sind, auch wenn der Benutzer nicht die Eingabetaste drückt. Hat noch jemand Ideen hier? Gibt es vielleicht einen besseren Weg, dies zu tun? Ich kann mir einige komplizierte Problemumgehungen vorstellen, aber sie sind alle hässlich und brechen wirklich die Kapselung zwischen verschiedenen Teilen der Benutzeroberfläche.

Wenn jemand eine einfachere und bessere Lösung hat, würde ich sie gerne hören.

5
Ed S.

Ein einfacher Ansatz, der "gut genug" sein könnte:

Sobald eine Änderung vorgenommen wurde (dh beim ersten Drücken des Zeichens), deaktivieren Sie die Schaltfläche "Start".

Aktivieren Sie die Schaltfläche nur, wenn Änderungen gespeichert wurden. Möglicherweise möchten Sie auch eine explizite Schaltfläche "Speichern", falls der Benutzer die Konvention, die die Eingabetaste speichert, nicht kennt.

2
Bevan

Erstens sollten Sie wahrscheinlich separate Schaltflächen zum Starten und Stoppen/Abbrechen haben. Dasselbe Knopf das Gegenteil tun zu lassen, ist ein Rezept für menschliches Versagen , wenn es eine Verzögerung gibt.

Wenn sich diese Situation auf die Schaltfläche Start beschränkt, können Sie die Schaltfläche Start aktiviert lassen und den Startbefehl zwischenspeichern und nach Beendigung des Besetztzustands senden (bis status == OK). Zwischenspeichern Sie nur einen Startbefehl, um das Senden mehrerer Startbefehle zu verhindern. Deaktivieren Sie die Schaltfläche Start und löschen Sie den Cache erst, nachdem Sie eine Bestätigung erhalten haben, dass Start speziell empfangen wurde.

Ich denke, Benutzer werden es sehr ärgerlich und möglicherweise fehlerverursachend finden, zwischen den Eingaben warten zu müssen, bis die Steuerelemente aktiviert sind. Ich kann mir vorstellen, dass Benutzer auf ein Steuerelement tippen oder klicken, das so aktiviert und deaktiviert wird, dass Benutzer nicht bemerken, dass einige Eingaben verloren gegangen sind. Vielleicht gibt es einen allgemeineren Weg, um mit dieser Situation für alle Kontrollen umzugehen:

  • Wenn die Belegungszeiten in der Regel kurz sind (<2 Sekunden) und Fehler sehr selten auftreten, sollten Sie die Befehle in die Warteschlange stellen all. Wenn ein Fehler auftritt, beenden Sie das Senden der Befehle, bis der Benutzer den Fix bereitstellt, und fügen Sie den Fix an die Vorderseite der Warteschlange ein. Setzen Sie dann das Senden fort. Möglicherweise möchten Sie auch eine aktive Warteschlangenverwaltung (z. B. Entfernen früherer Befehle, die durch spätere Befehle rückgängig gemacht werden).

  • Wenn die Auslastungszeiten in der Regel lang und die Fehler selten sind, sollten Sie alle zu sendenden Befehle in einer angemessenen Reihenfolge stapeln, wenn der Benutzer auf die Schaltfläche Start klickt. Stellen Sie sicher, dass Sie eine Rückmeldung geben, wann alle Vorstartbefehle in Ordnung sind (z. B. eine Fortschrittsmeldung "Checking Setup"), damit der Benutzer weiß, wann er sich abwenden kann. Möglicherweise möchten Sie auch einen akustischen Alarm in Betracht ziehen, wenn ein Fehler auftritt, falls sich der Benutzer trotz Ihres Feedbacks abgewiesen hat, bevor der Vorgang tatsächlich gestartet wurde.

  • Wenn die Stoßzeiten lang und fehlerhaft und häufig sind, haben Sie ein von Natur aus klobiges Gerät, das eine klobige Benutzeroberfläche erfordert. Verwenden Sie einen Assistenten, bei dem Benutzer jeden Befehl einzeln eingeben/akzeptieren und überprüfen, ob jeder Befehl ausgeführt wurde, bevor Sie mit dem nächsten fortfahren.

2