Leí un blog realmente bueno hace algún tiempo que analiza este tema (mencionado por Karl Bielefeldt), lo que básicamente dice es que es muy peligroso intentar hacer que el kit de interfaz de usuario sea seguro, ya que introduce posibles puntos muertos y depende de cómo sea implementado, las condiciones de carrera en el marco.
También hay una consideración de rendimiento. No tanto ahora, pero cuando Swing se lanzó por primera vez, fue muy criticado por su rendimiento (ha sido malo), pero eso no fue realmente culpa de Swing, fue la falta de conocimiento de la gente sobre cómo usarlo.
SWT hace cumplir el concepto de seguridad de subprocesos lanzando excepciones si lo viola, no bonito, pero al menos se lo ha informado.
Si observa el proceso de pintura, por ejemplo, el orden en que se pintan los elementos es muy importante. No desea que la pintura de un componente tenga un efecto secundario en ninguna otra parte de la pantalla. Imagine que si pudiera actualizar la propiedad de texto de una etiqueta, pero fue pintada por dos hilos diferentes, podría terminar con un resultado dañado. Por lo tanto, toda la pintura se realiza dentro de un solo hilo, normalmente según el orden de requisitos / solicitudes (pero a veces se condensa para reducir el número de ciclos de pintura física reales)
Menciona el cambio de Swing a JavaFX, pero tendría este problema con casi cualquier marco de interfaz de usuario (no solo clientes gruesos, sino también web), Swing parece ser el que resalta el problema.
Podría diseñar una capa intermedia (¿un controlador de un controlador?) Cuyo trabajo es garantizar que las llamadas a la IU estén sincronizadas correctamente. Es imposible saber exactamente cómo podría diseñar sus partes de su API que no son de UI desde la perspectiva de la API de UI y la mayoría de los desarrolladores se quejarían de que cualquier protección de subprocesos implementada en la API de UI era restrictiva o no satisfacía sus necesidades. Es mejor permitirle decidir cómo desea resolver este problema, según sus necesidades
Una de las cuestiones más importantes que debe tener en cuenta es la capacidad de justificar un orden determinado de eventos, en función de las entradas conocidas. Por ejemplo, si el usuario cambia el tamaño de la ventana, el modelo de cola de eventos garantiza que se producirá un orden determinado de eventos, esto puede parecer simple, pero si la cola permite que otros hilos activen eventos, entonces ya no puede garantizar el orden en cuáles son los eventos que pueden ocurrir (una condición de carrera) y, de repente, debes comenzar a preocuparte por diferentes estados y no hacer una cosa hasta que ocurra algo más y comiences a tener que compartir banderas de estado y termines con espagueti.
De acuerdo, podría resolver esto teniendo algún tipo de cola que ordenara los eventos según el momento en que se emitieron, pero ¿no es eso lo que ya tenemos? Además, aún no podría garantizar que el hilo B generaría sus eventos DESPUÉS del hilo A
La razón principal por la que las personas se molestan por tener que pensar en su código es porque están hechas para pensar en su código / diseño. "¿Por qué no puede ser más simple?" No puede ser más simple, porque no es un problema simple.
Recuerdo cuando se lanzó la PS3 y Sony habló sobre el procesador Cell y su capacidad de realizar líneas separadas de lógica, decodificar audio, video, cargar y resolver datos del modelo. Un desarrollador de juegos preguntó: "Eso es increíble, pero ¿cómo sincronizas las transmisiones?"
El problema del que hablaba el desarrollador era, en algún momento, que todas esas transmisiones separadas tendrían que sincronizarse en una sola tubería para la salida. El pobre presentador simplemente se encogió de hombros, ya que no era un problema con el que estaban familiarizados. Obviamente, han tenido soluciones para resolver este problema ahora, pero es divertido en ese momento.
Las computadoras modernas están recibiendo una gran cantidad de información de muchos lugares diferentes al mismo tiempo, toda esa información debe ser procesada y entregada al usuario de inmediato, lo que no interfiere con la presentación de otra información, por lo que es un problema complejo, sin Una única solución simple.
Ahora, tener la capacidad de cambiar los marcos, no es algo fácil de diseñar, PERO, tomar MVC por un momento, MVC puede tener varias capas, es decir, podría tener un MVC que se ocupe directamente de administrar el marco de la interfaz de usuario, usted podría envolver eso, nuevamente, en un MVC de capa superior que se ocupa de interacciones con otros marcos (potencialmente multiproceso), sería responsabilidad de esta capa determinar cómo se notifica / actualiza la capa MVC inferior.
Luego usaría la codificación para interconectar patrones de diseño y patrones de fábrica o de construcción para construir estas diferentes capas. Esto significa que los marcos multiproceso se desacoplan de la capa de interfaz de usuario mediante el uso de una capa intermedia, como idea.