multithreading - Cursores ocupados, ¿por qué?
user-interface asynchronous (12)
Creo que puede que tengas razón: en una aplicación asincrónica decente, nunca necesitas mostrar un cursor ocupado. El usuario siempre puede hacer algo incluso si la gran operación finaliza.
Dicho esto, a veces las aplicaciones Java como Netbeans o Eclipse, o incluso Visual Studio, se cuelgan sin cursor ocupado y sin esperanza. Pero en ese caso, un cursor ocupado probablemente tampoco ayudaría mucho ... pero creo que tienes razón: los cursores ocupados son de una era que no es de subprocesos múltiples para aplicaciones. En las aplicaciones Flex, por ejemplo, TODO es automáticamente devoluciones de llamada por eventos, por lo que establecer un cursor ocupado simplemente no tendría sentido (aunque es posible, por supuesto).
¿Alguien puede darme un escenario donde creen que los cursores ocupados están justificados? Siento que siempre son una mala idea desde la perspectiva de un usuario . Aclaración: por los cursores ocupados, quiero decir cuando el usuario ya no puede interactuar con la aplicación, solo pueden mover su puntero de reloj de arena y silbar una canción.
Cuando se pulsa el botón Actualizar en un navegador web, el cursor ocupado debe aparecer inmediatamente para indicarle al usuario que se está cargando una página.
Creo que fue Do not Make Me Think que dijo que el tiempo de carga tolerable para humanos es de cero segundos.
Google dice:
Sensible
Es posible escribir código que gane todas las pruebas de rendimiento en el mundo, pero que aún envía a los usuarios en un ataque de furia cuando intentan usarlo. Estas son las aplicaciones que no responden lo suficiente, las que se sienten inactivas, se cuelgan o se congelan durante períodos significativos, o tardan demasiado en procesar las entradas.
Hay dos propósitos para esto:
- Indique al usuario que algo está sucediendo.
- Indique al usuario que no se puede hacer nada ahora.
El cursor ocupado es una mejor señal sobre la operación que nada. Para operaciones más duraderas, se debe usar algo mejor. Por ejemplo, los navegadores siguen operativos cuando se recupera una página e incluso hay un botón para detener la operación. Como la interfaz de usuario es completamente funcional, no es necesario usar el cursor ocupado. Sin embargo, el cursor ocupado se puede usar incluso en este tipo de situaciones en las fases de transición, como al iniciar la operación o al detenerla.
Intento usarlos en cualquier acción que pueda tomar de 0.5 a 3 segundos, para acciones más largas, creo que deberían usarse indicadores de progreso con suficiente información.
Lo único que creo que hace el cursor ocupado es informar al usuario que ...
No te ignoro abiertamente, solo estoy haciendo otra cosa que puede tomar un tiempo
Muestra un cursor ocupado cuando el usuario no puede hacer nada hasta que la operación se complete, incluida la salida de la aplicación.
Me parece interesante que no vea los cursores ocupados en los navegadores web, quizás por eso a la gente le agradan tanto.
No, espera, tengo una mejor respuesta. Muestra un cursor ocupado cuando la computadora está pensando .
Noté con Fedora 8 al menos que cuando una aplicación establece el cursor "ocupado", en realidad se muestra el "ocupado interactivo". Supongo que esto se debe a que el sistema sigue respondiendo a la entrada del mouse (como arrastrar la ventana, etc.). Por otro lado, seleccionar el cursor "interactivo ocupado" explícitamente en Linux es complicado: http://www.pixelbeat.org/programming/x_cursors/
Por ejemplo, para indicar que ha hecho clic en un botón, aunque no haya terminado de procesar el evento. Si no hubiera alguna indicación, el usuario podría tratar de hacer clic en el botón otra vez, causando todo tipo de maldad.
Si bien es absolutamente necesario alertar al usuario de que su aplicación está haciendo algo, un cursor ocupado solo es útil durante los primeros segundos de procesamiento. Para un retraso de más de 15-20 segundos, se debe presentar algo más, como una barra de progreso, un mensaje de estado, un cuadro de mensaje, lo que sea. La gente asume que su software se ha bloqueado después de aproximadamente un minuto y tratará de terminarlo. A veces, las señales visuales generales son tan importantes como un cursor ocupado.
Por ejemplo, las aplicaciones con pestañas que no responden con el resaltado adecuado hasta que finalice la operación en la pestaña se pueden arreglar actualizando la pestaña temporalmente hasta que se completen todas las operaciones. A veces, solo un poco de optimización o refactorización limpiará la capacidad de respuesta de la interfaz de usuario horrible como esta.
Los usaría solo para completar cosas rápidamente, como decir menos de medio segundo. Si algo lleva más tiempo que eso, debería aparecer un diálogo de progreso, o una barra de progreso debería aparecer en la barra de estado o en otro lugar en la interfaz.
El usuario siempre debe poder cancelar la acción si tarda demasiado en completarse.
En respuesta al comentario, el cursor ocupado solo sería visible durante medio segundo o más, ya que una vez que el diálogo de progreso esté activo, debería cambiar a uno de esos cursores "medio ocupado", o simplemente al cursor de flecha normal.
Debería evitar tener un cursor ocupado arriba, excepto en circunstancias extremas, y si cree que necesita uno, piense de nuevo y rediseñe.
En resumen, creo que el usuario debería estar bloqueado para hacer cosas en su aplicación solo cuando el intervalo de espera sea muy corto (2 segundos o menos) y la carga cognitiva de realizar varios subprocesos probablemente resulte en una aplicación menos estable. Para más detalles, ver a continuación.
Para una operación que dura menos de 0.1 segundo , generalmente no necesita ir asincrónico o incluso mostrar un reloj de arena.
Para una operación que dura entre 0.1 y 2 segundos , generalmente no necesita ir asincrónico. Simplemente cambie el cursor al reloj de arena, luego haga el trabajo en línea. La señal visual es suficiente para mantener feliz al usuario final.
Si el usuario final inicia una operación que va a tomar solo un par de segundos, está en un modo de pensar "enfocado" en el que está inconscientemente esperando los resultados de su acción, y no ha cambiado su cerebro consciente de ese enfoque particular. De modo que bloquear la IU, con un indicador visual de que esto ha sucedido, es perfectamente aceptable durante un período de tiempo tan corto.
Para una operación que dura más de 2 segundos , por lo general, debe ir sin sincronización. Pero incluso entonces, debe proporcionar algún tipo de indicador de progreso. Las personas encuentran difícil concentrarse en la ausencia de estimulación, y 2 segundos es lo suficientemente largo como para que el usuario final vaya a pasar naturalmente de la actividad consciente "enfocada" a la actividad consciente de "espera".
El indicador de progreso les da algo para ocuparlos mientras están en ese modo de espera, y también les da los medios para determinar cuándo volverán a su contexto "centrado". Las claves visuales le dan al cerebro algo sobre lo cual estructurar esos cambios de contexto, sin exigir demasiado pensamiento consciente.
Donde se complica es donde tiene una operación que generalmente se completa en X veces, pero de vez en cuando toma Y , donde Y es mucho mayor que X. Esto puede suceder para acciones remotas como llegar a través de una red. Ahí es cuando puede necesitar una combinación de las acciones anteriores. Por ejemplo, considere mostrar un temporizador de huevos durante los primeros 2 segundos y solo luego traer su indicador de progreso. Esto evita desgarrar al usuario final del contexto "centrado" directamente al contexto de "espera" sin un paso intermedio.
No es específicamente el cursor ocupado lo que es importante, pero SIEMPRE es importante informar al usuario que algo está sucediendo en respuesta a su entrada. Es importante darse cuenta de que sin un cursor ocupado, barra de progreso, pulsador, botón parpadeante, bastón giratorio, payaso danzante ... no importa NADA, si no lo tiene, y la computadora simplemente se queda allí sin hacer nada, la computadora se ve rota para el usuario.
La retroalimentación inmediata para cada acción del usuario es increíblemente importante.