Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Многопользовательский режим работы проги


Автор: Pcrepair 26.4.2012, 12:26
Добрый день. Есть программа, написанная в стиле процедурного програмированния в РАД2010:
- программа имеет GUI (МЕМО1, МЕМО2, Кнопка и дополнительно настройка алгоритма обработки)
- пользователь вводит исходные данные в окно ввода МЕМО1, нажимает кнопку
- программа обрабатывает данные по сложному алгоритму, зависящему от введенных пользователем данных (текст)
- программа выводит результат работы в МЕМО2
на это цикл работы программы заканчивается
В ближайшее время кнопка и МЕМО1,2 будут вынесены в ВЕБ-интерфейс (ВЕБ-сервер на одном хосте в просторах интернета) и пользователь будет подключаться к программе как к удаленному сервису через браузер.
на текущий момент и после подключения ВЕБ-интерфейса программа одномоментно может работать только с одним пользователем, демо-версия

Вопрос: каким образом можно ввести многопользовательский режим:
- каждый пользователь получает свою сесссию на ВЕБ-сервере, это понятно
- каждый пользователь должен получить на сервере приложения свой поток?
в общем как перевести программу написанную для работы с одним пользователем в многопользовательский режим? какие для этого существуют способы?

Автор: Snowy 26.4.2012, 12:40
если у каждого пользователя свой поток, то не вижу проблемы...

Автор: Pcrepair 26.4.2012, 13:21
так что? нужно переписать код с использованием потоков?

Автор: Snowy 26.4.2012, 13:28
Зависит от того, как программа будет работать в веб-сессиями.
Если, например, как модуль к аппачу, то не нужно ничего переделывать - аппач сам выдаст отдельный тред.
Если, как cgi, то опять же ничего переделывать не нужно - будет запущено несколько экземпляров программы.
Если же программа сама будет веб-сервером, то просто вызов процедур нужно будет осуществлять из треда - без использования глобальных переменных проблем не возникнет.

Для начала нужно определиться как прикрутить программу к серверу.

Автор: Pcrepair 26.4.2012, 13:38
программа вообщето на отдельном сервере приложений, написана на ДЕЛФИ. сервер находится в одном городе, в одном здании, в одной комнате, подключен к интернету
сервер периодически подключается к веб-серверу(апач конечно, на каком нибуть дешевом хосте где то в просторах интернетума) к ЧАТу, смотрит, нет ли запроса от пользователя
ту да же подключается пользователь, вводит в окно ввода текст и нажимает большую красную кнопку (ранее известную как "кракер интернета")
сервер получает задачу, решает задачу и отсылает данные взад, в ЧАТ где пользователь их видит, на ХТМЛ странице
пока все это работает в однопользовательском режиме, пока текущий пользователь не закончил сессию, другой пользователь не можеи получить доступ к серверу приложений, который находится......

теперь то понятно о чем идет речь?

Автор: Snowy 26.4.2012, 14:22
Ну в данном варианте получается, что сервер - это апач в интернете.
А приложение является клиентским по отношению к апачу.
В этом случае нет никакой необходимости создавать несколько тредов.
Можно просто последовательно обработать несколько запросов.

Автор: Pcrepair 26.4.2012, 14:42
нет, апач - это апач, на котором установлен ЧАТ
к ЧАТу подключается пользователь и вводит задание
к ЧАТу подключается сервер приложений берет и обрабатывает задание
решив задание, сервер приложений отправляет результат в ЧАТ

так понятно?

Автор: Snowy 26.4.2012, 15:05
В данном случае сервер приложений является клиентом чата.
А раз он клиент, то многопоточность ему не нужна, т.к. он непосредственно не должен держать несколько сессий.

Автор: Pcrepair 26.4.2012, 15:14
как раз именно несколько сессий(заданий) клиент ЧАТа и должен выполнять
чтоб пользователи не видели таблички "ЗАНЯТО", которая обязательно будет поскольку цикл обработки задания может зпнимать от нескольких минут до нескольких часов

Автор: Snowy 26.4.2012, 15:30
Ну тогда тебе нужен отдельный дежурный поток, который будет загружать страничку чата и добавлять задания в очередь.
А основной поток будет брать задания из очереди, выполнять.

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

Автор: Pcrepair 26.4.2012, 15:33
то есть нужно изучить и использовать Classes.TThread?
может еще какие косяки известны? по потокам

Автор: Snowy 26.4.2012, 16:44
Всё необходимое есть тут:
http://forum.vingrad.ru/forum/topic-60076.html

Автор: Pcrepair 26.4.2012, 16:52
Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)