-
Здравствуйте все...
Имеем сервер автоматизации и клиента, который запускает его методы.
Вопросы:
Каким образом можно во время выполнения метода (длительная обработка данных) сервером, с клиента:
1. остановить (завершить) выполнение метода на сервере?
2. позволить клиенту во время выполнения метода на сервере заниматься другими делами?
-
ЗЫ: Взаимодействие клиента с сервером через socketserver
ЗЗЫ: Вызов метода (запуск обработки) - типа SocketConnection1.AppServer.Work
Пока SocketConnection1.AppServer.Work не завершился - надо позволить клиенту заниматься другими делами...
-
Клиент вызывает метод сервера, среди параметров которого - предоставляемый клиентом callback-интерфейс.
Сервер запускает выполнение запроса в отдельном потоке, а клиенту вертает ERROR_IO_PENDING.
Когда сервак закончит обработку запроса, он известит клиента через ентот самый callback. Прервать мона отдельным методом сервака, callback передать один раз за сеанс, а не в вызове кажного метода.
Гдей-то в кладовке валятся ComService2.zip, там чей-то типа такого реализовано. Правда без сокетов, но суть-то та-же
-
Ну а как клиенту позволить не ждать завершения метода, вызванного на сервере???
-
Ты че, дальтоник? Сервер запустил поток, выполняющий запрос и вышел из метода. Клиент получил результом ERROR_IO_PENDING. Завершится выполнение, сервер вызовет каллбэк - типа все тип-топ или обломс. Где тут ожидание???
-
> Ты че, дальтоник?
Спокойней, да...
> Где тут ожидание???
Метод SocketConnection1.AppServer.Work представляет собой
> длительная обработка данных
Клиент сказал серверу "WORK!!!!", и пока сервер шевелит мозгами клиент не двигается дальше до получения результата. Вот и ожидаем...
-
> Клиент сказал серверу "WORK!!!!", и пока сервер шевелит
> мозгами клиент не двигается дальше до получения результата.
> Вот и ожидаем...
потоки + callback или WaitForMultipleObject (дабы сбросом event-а можно было прервать ожидание) .
-
>Клиент сказал серверу "WORK!!!!", и пока сервер шевелит мозгами клиент не двигается дальше до получения результата. Вот и ожидаем...
Ну вот и жди дальше. В саду.
-
>
ОФФ: тебе не дали сегодня?
-
А ты как догадался? Тебе б такую сообразительность в кодинге - цены бы не было.
-
> wsv (03.04.08 10:00) [5]
Дай четкое толкование выражения "клиент не двигается"
-
> Дай четкое толкование выражения "клиент не двигается"
Не суетиться под серевером.
-
>
> Дай четкое толкование выражения "клиент не двигается"
Вызов метода сервера с клиента происходит так:
SocketConnection1.Connected:=true;
SocketConnection1.AppServer.Work;
SocketConnection1.Connected:=false;
Пока метод не завершен, и коннекшн не закрыт, на клиенте нет возможности делать что-то еще, кроме как ждать Connected:=false;
Т.е. например просто подвинуть на клиенте форму.
Смысл такой же, как бесконечный цикл без ProcessMessages.
i:=0;
while (i<1)and(application.Terminated=false) do
begin
application.ProcessMessages;
i:=0;
end;
Типа убрать из цикла application.ProcessMessages и станет понятно, что значит "не двигается".
-
Это самое "не двигается" называется "клиентское приложение не реагирует на события пользовательского ввода".
Пользовательский ввод в шаблонном VCL-приложении осуществляется в основном кодовом потоке процесса, в котором тобой вызывается метод Work, во время исполнения которого поток не имеет возможности обрабатывать те самые события ввода.
Простейшее решение напрашивается само собой - вынести работу с аппсервером в дополнительный кодовый поток.