7

¿Por qué los elementos de la interfaz de usuario siempre se deben crear/actualizar desde el subproceso de interfaz de usuario?¿Por qué los elementos de la interfaz de usuario siempre se deben crear/actualizar desde el hilo de la interfaz de usuario?

En (¿casi?) Todos los elementos de la IU de lenguajes de programación se pueden acceder/modificar de forma segura solo desde el hilo de la interfaz de usuario. Entiendo que es un problema estándar de acceso concurrente y sincronización, pero ¿es realmente necesario? ¿Este comportamiento es impuesto por los lenguajes de programación o por el sistema operativo? ¿Hay algún lenguaje de programación donde esta situación sea diferente?

Respuesta

9

Lo impone el marco de gráficos, que a menudo (pero no siempre) es suministrado por el sistema operativo.

Básicamente, hacer que todo sea "adecuado para la rosca" es ineficiente. Si bien es ciertamente difícil tener que coordinar las llamadas al hilo de UI, permite que el hilo de la interfaz de usuario procese eventos extremadamente rápido sin tener que preocuparse por el bloqueo, etc.

+0

¿No sería más fácil para el marco hacer el control y ordenar la llamada en lugar de correr el riesgo de que alguien la llamara de una manera insegura en primer lugar? el framework .Net podría haberlo hecho por nosotros al menos ... – ak3nat0n

+0

Yo diría que no. Si realiza una llamada a la propiedad Texto de un cuadro de texto, ahora mismo es un conjunto bastante rápido. Si aplica el manejo al marco, * cada * llamada estará sujeta a esa penalización, aunque la mayoría de las actualizaciones provengan del propio subproceso de la interfaz de usuario. – jasonh

+0

@zaladane: Creo que puede no ser tan fácil determinar (automáticamente) cuándo se requiere código para ejecutarse en el subproceso UI. Yo preferiría una construcción en el lenguaje (tal vez un poco como la palabra clave insegura) para ejecutar una pieza específica de código en el subproceso UI. Eso sería un poco más fácil de leer que el código de Dispatcher. – Zyphrax

6

Sería muy costoso (lento) hacer el toda la interfaz de usuario es segura para subprocesos. Es mejor que el programador cargue con la sincronización en la (relativamente rara) ocasión que un hilo necesita para actualizar la interfaz de usuario.

5

Es porque el marco de la interfaz de usuario se ha diseñado de esa manera. En teoría, es posible diseñar un marco de interfaz de usuario que sea verdaderamente de múltiples subprocesos, pero es difícil evitar interbloqueos.

Graham Hamilton escribió un buen artículo sobre esto con referencia a Swing, el principal marco de la interfaz de usuario de Java.

Cuestiones relacionadas