Автор Тема: Модель STA и User Interface  (Прочитано 6791 раз)

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Модель STA и User Interface
« : Июль 12, 2013, 08:25:02 am »
Один из архитекторов WPF, Крис Андерсон, писал:
Цитировать
В самом начале разработки WPF мы задались целью устранить зависимость от модели с однопотоковым контейнером (STA). Для многих элементов управления ActiveX и других служб на основе COM необходима именно потоковая модель STA, требующая, чтобы в каждый момент времени код компонента исполнялся только в одном потоке, причем всегда одном и том же. В настоящее время почти все пользовательские интерфейсы в Windows работают в предположении модели STA.

Проблема STA заключается в том, что все объекты привязаны к единственному потоку и не могут переместиться ни в какой другой. Требование о том, чтобы некий фрагмент кода исполнялся одним потоком, – это очень эффективное упрощение, но раз и навсегда привязывать исполнение к единственному потоку, – пожалуй, чересчур. Увы, когда версия «Longhorn» превратилась в Vista, мы осознали, что для того, чтобы WPF могла работать с существующими службами (буфер обмена, Internet Explorer и т. д.), нам придется поддержать STA. Поэтому мы решили создать одну потоковую модель, а не поддерживать несколько.

Поэтому, к моему величайшему сожалению, я вынужден сообщить, что WPF требует потоковой модели STA.

Т. к. я ни хрена не знаю не обладаю широким кругозором, то вопрос такой: а кто нибудь "в мировом масштабе" ушел от STA в UI?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Модель STA и User Interface
« Ответ #1 : Июль 12, 2013, 09:01:58 am »
X11
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Модель STA и User Interface
« Ответ #2 : Июль 12, 2013, 03:50:15 pm »
Один из архитекторов WPF, Крис Андерсон, писал:
Цитировать
Проблема STA заключается в том, что все объекты привязаны к единственному потоку и не могут переместиться ни в какой другой.

Т. к. я ни хрена не знаю не обладаю широким кругозором, то вопрос такой: а кто нибудь "в мировом масштабе" ушел от STA в UI?

Я так и не понял какую проблему они решали. Они хотели кнопки между потоками перемещать? А нафига? Или просто перемешали гуйню с вычислительной частью и захотели решить проблему разрешив кнопкам гулять между потоками?

Я когда-то разрабатывал многопоточное приложение с COM и гуйней. Да, я реально запарился с синхронизацей всего этого дела. И только сколько-то лет спустя осознал, что херню делал - просто не надо было пускать COM дальше одного потока и делать синхронизацию наиболее удобным способом (без всяких ограничений STA). Но допереть до такого решения, конечно, не просто, потому что массовый шаблонный штамп - если тебе нужна поддержка COM, то значит ты все классы наследуешь от IUnknonwn... и понеслось.

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Модель STA и User Interface
« Ответ #3 : Июль 13, 2013, 11:58:07 am »
Проблема приблизительно такая: отправляем запрос на сервер и получаем ответ, что может происходить долго, и в основном потоке этого делать нельзя. Производится обработка полученного ответа и построение окна пользовательского интерфейса. Пользовательский интерфейс в другом потоке не построишь, а обработку не хочется делать в основном. Выход - промежуточный слой, без которого было бы проще.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Модель STA и User Interface
« Ответ #4 : Июль 13, 2013, 12:38:20 pm »
Проблема приблизительно такая: отправляем запрос на сервер и получаем ответ, что может происходить долго, и в основном потоке этого делать нельзя. Производится обработка полученного ответа и построение окна пользовательского интерфейса. Пользовательский интерфейс в другом потоке не построишь, а обработку не хочется делать в основном. Выход - промежуточный слой, без которого было бы проще.
Выход - неблокирующее IO и банальный корутины и всяка-разна легковесная многопоточность (настоящая, а не та, которую пытаются изобразить в ББ).
Y = λf.(λx.f (x x)) (λx.f (x x))

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Модель STA и User Interface
« Ответ #5 : Июль 15, 2013, 01:27:19 pm »
неблокирующий ввод-вывод тоже требует потока для своей работы. И постобработка всё-таки какого-то времени требует. Так что непонятно, как обойтись без промежуточного слоя.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Модель STA и User Interface
« Ответ #6 : Июль 15, 2013, 01:43:22 pm »
неблокирующий ввод-вывод тоже требует потока для своей работы. И постобработка всё-таки какого-то времени требует. Так что непонятно, как обойтись без промежуточного слоя.
Предлагаю обсудить на каком-то конкретном примере.
Y = λf.(λx.f (x x)) (λx.f (x x))

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Модель STA и User Interface
« Ответ #7 : Июль 15, 2013, 05:15:29 pm »
Например, что-то вроде графического приложения для аналога дропбокса, который не хранит на своей стороне копию данных, хранящихся удалённо. Приложение будет выглядеть как Проводник: слева дерево директорий, справа - файлы в текущей директории.

Нажимаем на плюсик около директории - на сервер уходит запрос о содержимом директории. Пришедшие данные преобразуются из "походного" вида в более подобающий (список директорий указанного уровня) и встраиваются в другие данные, которые были получены подобным же образом на предыдущих итерациях. Потом эта группа данных передаётся в элемент управления "дерево" для отображения.

П.С. В этом примере не очень много постобработки ответа, но у меня есть уверенность, что она может быть больше по объёму.

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Модель STA и User Interface
« Ответ #8 : Июль 15, 2013, 05:18:22 pm »
она может быть больше по объёму.
Например, музыкальный плейер с музыкой, хранящейся онлайн. Переходим к какому-нибудь альбому, и в ответе от сервера приходит картинка, которую мы на своём компе подгоняем под размер окна программы.

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Модель STA и User Interface
« Ответ #9 : Июль 15, 2013, 05:57:51 pm »
Выход - неблокирующее IO и банальный корутины ...
А причем тут вообще корутины (сопрограммы?).
Они не работают параллельно.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Модель STA и User Interface
« Ответ #10 : Август 27, 2013, 07:04:59 am »
Если говорить о многопоточности, то очевидными кандидатами будут
Компонентный каркас Bluebottle для Активного Оберона и VBT для Модулы-3