Пользовательский интерфейс и многопоточность.
От: Аноним  
Дата: 20.10.05 13:58
Оценка:
Добрый день.

При разработке пользовательского интерфейса клиентской части к серверу собственной разработки (на основе блокирующих синхронных winsock + delphi) мы столкнулись с рядом проблем.

Главным требование к клиенту является — запросы должны выполняться асинхронно.
Запросы бывают двух видов:
1. Явно инициированные пользователем (например, нажатие на кнопку)
2. Запросы по таймеру.

В первом случае под асинхронностью главным образом понимается следующее:
1. Пользователь нажал кнопку.
2. Запрос обрабатывается.
3. Но главная форма не "висит", т.е. как минимум перерисовывается.

В этом случае решается все просто (пока сделано именно так) — на время выполнения запроса показывается диалоговое окно (типа — подождите, идет запрос...). Сообщения windows обрабатываются, т.е. форма перерисовывается. При получении сообщения из потока, выполняющего запрос, диалоговое окно закрывается и происходит обновление клиентских структур данных.

В запросах второго вида (по таймеру) все сложнее. Данные запросы должны выполняться невидимо пользователю (т.е. блокировка gui на время выполнения недопустима). При наступлении определенного события (например, на сервере обновились данные и их нужно обновить на клиенте), поток, выполняющий запрос, посылает сообщение главному потоку (тому, который ответственнен за gui). Тут есть некотолрые проблемы. Например, пользователь пользуется клиентскими структурами данных (например, происходит какой-то долгий математический расчет). Поэтому, изменение стукртур данных недопустимо. Приходится откладывать обновление до момента, когда пользователь перестает пользоваться данными.

При всем этом программировании, есть ощущение, что ты решаешь проблемы, которые уже кем-то успешно решены и осмысленны.

Поэтому вопрос: есть ли в природе некая литература по созданию многопоточных пользовательских интерфейсов? Например, какие-то паттерны (типа GoF) или еще что? И в частности по реализации на клиенте асинхронных запросов?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.