Деякий час тому я прочитав справді хороший блог, в якому обговорювали цю проблему (згадував Карл Білефельдт), але в основному йдеться про те, що намагатися зробити безпеку нитки набору інтерфейсу користувача дуже небезпечно, оскільки це вводить можливі тупикові місця і залежно від того, як це реалізовані, перегони умови в рамках.
Також є врахування ефективності. Зараз не так багато, але коли Swing був вперше випущений, його піддавали сильній критиці за його продуктивність (це було погано), але це насправді не було виною Swing, тому що люди не знали, як ним користуватися.
SWT застосовує концепцію безпеки потоку, викидаючи винятки, якщо ви їх порушуєте, не дуже, але принаймні вам про це відомо.
Якщо ви заглянете в процес фарбування, наприклад, порядок, в якому елементи фарбуються, дуже важливий. Ви не хочете, щоб фарбування одного компонента побічно впливало на будь-яку іншу частину екрану. Уявіть собі, якби ви могли оновити властивість тексту мітки, але вона була намальована двома різними потоками, ви могли б отримати зіпсований вихід. Таким чином, вся фарбування виконується в межах однієї нитки, як правило, виходячи з порядку вимог / запитів (але іноді стискається, щоб зменшити кількість фактичних фізичних циклів фарби)
Ви згадуєте про перехід від Swing до JavaFX, але у вас виникне ця проблема практично з будь-якою рамкою інтерфейсу користувача (не тільки з товстими клієнтами, але і з Інтернетом), Swing, здається, саме той, що висвітлює проблему.
Ви можете розробити проміжний рівень (контролер контролера?), Завданням якого є забезпечення правильної синхронізації дзвінків до інтерфейсу. Неможливо точно знати, як ви могли б спроектувати ваші не-інтерфейси частини API з точки зору API інтерфейсу, і більшість розробників скаржиться, що будь-який захист потоку, реалізований в API інтерфейсу, повинен бути обмежувальним або не відповідає їх потребам. Краще, щоб ви могли вирішити, як ви хочете вирішити це питання, виходячи з ваших потреб
Одне з найбільших питань, яке потрібно врахувати, - це можливість обґрунтувати заданий порядок подій на основі відомих даних. Наприклад, якщо користувач змінює розмір вікна, модель черги подій гарантує, що буде задано порядок подій, це може здатися простим, але якщо черга дозволила подіям викликати інші потоки, ви більше не можете гарантувати замовлення в які події можуть статися (умова перегонів) і раптом вам доведеться почати турбуватися про різні стани, а не робити одне, поки щось інше не станеться, і ви почнете ділитися державними прапорами навколо, і ви закінчите спагетті.
Гаразд, ви можете вирішити це, маючи якусь чергу, яка впорядковувала події залежно від часу їх видачі, але чи не це ми вже маємо? Крім того, ви все ще не можете гарантувати, що потік B буде генерувати події ПІСЛЯ потоку A
Основна причина, чому люди турбуються про необхідність думати про свій код, полягає в тому, що вони змушені думати про свій код / дизайн. "Чому не може бути простіше?" Це не може бути простішим, адже це не проста проблема.
Я пам'ятаю, коли PS3 був випущений, і Sony розговорилася процесором Cell, і це можливість виконувати окремі лінії логіки, декодувати аудіо, відео, завантажувати та вирішувати дані моделі. Один розробник гри запитав: "Це все приголомшливо, але як синхронізувати потоки?"
Проблема, про яку говорив розробник, полягає в тому, що в якийсь момент всі ці окремі потоки повинні бути синхронізовані до однієї труби для виведення. Бідний ведучий просто знизав плечима, оскільки це не було питання, з яким вони були знайомі. Очевидно, у них були рішення, щоб вирішити цю проблему зараз, але це було смішно на той час.
Сучасні комп’ютери одночасно беруть багато інформації з безлічі різних місць, все це потрібно обробляти та доставляти користувачеві далеко, що не заважає представленню іншої інформації, тому це складна проблема, поза єдине просте рішення.
Тепер, маючи можливість перемикати рамки, це непроста річ, яку можна розробити, АЛЕ, візьміть MVC на мить, MVC може бути багатошаровим, тобто у вас може бути MVC, який займається безпосередньо управлінням фреймворком інтерфейсу, ви Тоді можна було б обговорити це, знову ж таки, у вищому шарі MVC, який займається взаємодією з іншими (потенційно багатопотоковими) рамками, відповідальність за цей шар визначатиме, як повідомляється / оновлюється нижній шар MVC.
Потім ви будете використовувати кодування для побудови моделей інтерфейсу та фабричних або будівельних моделей для побудови цих різних шарів. Це означає, що ви багатопотокові рамки від'єднуєтесь від шару інтерфейсу через використання середнього шару як ідеї.