私のアプリケーションにはツールバーとその上にたくさんのボタンがあります。一部のボタンは、長時間実行されているプロセス(タスク)を開始します。この時点で、すべてのタスクは非同期で実行され、タスクの実行中にユーザーが他のことを実行できるようにします。そのため、問題があります。ユーザーが同じボタンを何度もクリックして、他の同じタスクを開始できます。タスクを開始する前にボタンを無効にし、終了後に有効にすることにしました。その他の問題、他のボタンを押さないように保護する必要があります(これらの一部は、現在のタスクを実行すると無効になります)。一般に、ユーザーがボタンで一時的に危険なことを行えないように、すべてのボタン(ツールバー)を無効にする必要があります。私の質問は:
ちらつきからユーザーをそらす方法(無効化/有効化ボタン)や、プロセスにユーザーを関与させる方法、そのタスクをユーザーに実行させる方法がそれほど長くない方法を誰かが推奨できますか?
たぶん私は同期的にタスクを実行し、実行時にすべてのUIを無効にする必要がありますか?
ちなみに、遅延は1秒から10秒まで変化します。進行状況バーについて:現在の進行状況を計算することは困難であり、パフォーマンスの低下を引き起こします(他のスレッドからのUIの反復を追加しなくても、タスクをより速く実行できます)。
最終的にこれは、適切なフィードバックを提供することによってユーザーに通知し続けることに関する問題です。
すぐに最初に行うことは、ボタンが押されたことを示し、ボタンをもう一度押すことができると思わせないことです。多くの場合、ボタンを無効にすることで行われますが、別の方法については以下を参照してください。
遅延は可変長になる可能性があるため、メソッドは、タスクにかかる時間をユーザーに通知できる必要があります。進行状況の計算が難しすぎる場合は、「数秒」かかることを示すことができます。必ず肯定的な用語を使用してください。
私は本当に一時的にuiのチャンクを無効にするのが好きではありません-何かが失敗した場合に再び有効にされないリスクが常にあります。したがって、UIをブロックする必要がある場合は、モーダルダイアログのオプションを使用して、上記のメッセージをユーザーに通知します。その上、UIを無効にすることは直接関連するフィードバックメカニズムではなく、プログラミングハックであり、何が起こっているのかユーザーに不思議に思わせるだけです。
そのため、現在のタスクに関するユーザーフィードバックを提供するには、モーダルダイアログを使用して上記のメッセージを表示し、アプリケーションをブロックするか、ユーザーができないようにするかどうかに応じて、アプリケーション内のフィードバック/ステータス領域に表示しますUIと対話することができます。
タスクがアクティブなときに、ユーザーに残りのUIへのアクセスを許可することにした場合、すべての機能が通常どおり動作しているように見えます。アクティブなタスクを開始したボタンで、この特定の機能がアクティブであることを示すことができます。通常、これはボタンを無効にすることで行われますが、より直接的なコミュニケーションのアイデアは、ボタンに角のアイコンを追加してアクティブ状態を示すことです。これは、小さな砂時計または他のビジーなアイコンである可能性があります。ユーザーがボタンをクリックすると、アクションが既にアクティブであることを通知するだけです。ツールチップは、アクティブステータスを示すこともできます。非常にローカライズされた、コンテキストごとのボタンごとのフィードバックのこのアイデアは、非常にうまく機能するはずです。
理想的には、アプリケーションがユーザー入力に可能な限り応答するようにする必要があります。したがって、実行時間の長いタスクを非同期で実行することは間違いなく理にかなっています。
ユーザーが同じタスクを再送信する限り、いくつかのオプションがあります。
タスクの前にボタンを無効にする/タスクの後に有効にする(これは、アプリケーションが正確に何をしているのかを知らない私のデフォルトの選択です):すでにこれを行っているようです。ボタンを無効化/有効化するための正しいロジックの開発は複雑になる可能性がありますが、エンドユーザーにとってアプリケーションがより直感的になるのであれば、努力する価値があります。
送信されたタスクのキャッシュ:ユーザーがタスクを送信した場合、入力パラメーターをキャッシュします。彼が2回目にタスクを送信し、入力パラメーターがキャッシュにある場合は、2回目にタスクを開始しないでください(既に実行されているため)。このオプションはべき等であるタスクの実行に依存するため、すべてのケースに適用されるわけではありませんが、使用できる場合を使用する場合、無効にすることを心配する必要はありません/有効化ロジック。
タスクを複数回実行するだけ:これは推奨されない(!)アプローチとして使用される場合もありますが、センス。たとえば、プロトタイプのみを作成している場合(最小限に実行可能な製品のように)、アプリケーションをできるだけ早くそこに公開したいとします。その場合、アプリケーションの使用方法について学ぶことは、コンピューティングリソースを浪費することよりも重要です。これらのタスクは使用されないこともあるので、それらのために何かを開発しないことで時間を節約できます。
ちらつきを避けたい場合は、Joelのアドバイスに従うことができます: "メニュー項目を非表示または無効にしない" で、ユーザーがツールバーボタンを押したときに、既に実行中または別の実行の妨げになる場合タスク、ユーザー要求を完了できない理由に関するメッセージを表示するか、「送信されたタスクをキャッシュする」(および実行するタスクのウィンドウがある)か、ユーザー要求として実行して再度実行することができます(注意してください)ここで同期の問題の)。
簡単な提案:「チェックボックスボタン」にして、「押された」/「チェックされた」状態でタスクが実行中であることを示すことができますか。次に、タスクの非同期が完了すると、自動的に「押し解除」/「チェック解除」しますか?
ボタンを無効にしませんが、代わりに、既に実行中にアクションが呼び出されることを内部的に確認します。ただし、アクションが実行されているとき、およびアクションが完了したときに、良いフィードバックがあることを確認しました。