Конференция "Corba" » Длительны операции сервера автоматизации [Delphi, Windows]
 
  • wsv (03.04.08 08:16) [0]
    Здравствуйте все...
    Имеем сервер автоматизации и клиента, который запускает его методы.

    Вопросы:
    Каким образом можно во время выполнения метода (длительная обработка данных) сервером, с клиента:
    1. остановить (завершить) выполнение метода на сервере?
    2. позволить клиенту во время выполнения метода на сервере заниматься другими делами?
  • wsv (03.04.08 08:29) [1]
    ЗЫ: Взаимодействие клиента с сервером через socketserver
    ЗЗЫ: Вызов метода (запуск обработки) - типа SocketConnection1.AppServer.Work

    Пока SocketConnection1.AppServer.Work не завершился - надо позволить клиенту заниматься другими делами...
  • ага (03.04.08 09:02) [2]
    Клиент вызывает метод сервера, среди параметров которого - предоставляемый клиентом callback-интерфейс.
    Сервер запускает выполнение запроса в отдельном потоке, а клиенту вертает ERROR_IO_PENDING.
    Когда сервак закончит обработку запроса, он известит клиента через ентот самый callback. Прервать мона отдельным методом сервака, callback передать один раз за сеанс, а не в вызове кажного метода.

    Гдей-то в кладовке валятся ComService2.zip, там чей-то типа такого реализовано. Правда без сокетов, но суть-то та-же
  • wsv (03.04.08 09:16) [3]
    Ну а как клиенту позволить не ждать завершения метода, вызванного на сервере???
  • ага (03.04.08 09:52) [4]
    Ты че, дальтоник? Сервер запустил поток, выполняющий запрос  и вышел из метода. Клиент получил результом ERROR_IO_PENDING. Завершится выполнение, сервер вызовет каллбэк - типа все тип-топ или обломс. Где тут ожидание???
  • wsv (03.04.08 10:00) [5]

    > Ты че, дальтоник?


    Спокойней, да...


    > Где тут ожидание???

    Метод SocketConnection1.AppServer.Work представляет собой

    > длительная обработка данных


    Клиент сказал серверу "WORK!!!!", и пока сервер шевелит мозгами клиент не двигается дальше до получения результата. Вот и ожидаем...
  • tesseract © (03.04.08 10:07) [6]

    > Клиент сказал серверу "WORK!!!!", и пока сервер шевелит
    > мозгами клиент не двигается дальше до получения результата.
    >  Вот и ожидаем...


    потоки + callback или WaitForMultipleObject (дабы сбросом event-а можно было прервать ожидание) .
  • ага (03.04.08 10:58) [7]

    >Клиент сказал серверу "WORK!!!!", и пока сервер шевелит мозгами клиент не двигается дальше до получения результата. Вот и ожидаем...

    Ну вот и жди дальше. В саду.
  • wsv (03.04.08 12:49) [8]

    >


    ОФФ: тебе не дали сегодня?
  • ага (03.04.08 12:52) [9]
    А ты как догадался? Тебе б такую сообразительность в кодинге - цены бы не было.
  • Сергей М. © (03.04.08 16:05) [10]

    > wsv   (03.04.08 10:00) [5]


    Дай четкое толкование выражения "клиент не двигается"
  • tesseract © (03.04.08 16:26) [11]

    > Дай четкое толкование выражения "клиент не двигается"


    Не суетиться под серевером.
  • wsv (04.04.08 07:22) [12]

    >
    > Дай четкое толкование выражения "клиент не двигается"


    Вызов метода сервера с клиента происходит так:

    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 и станет понятно, что значит "не двигается".
  • Сергей М. © (04.04.08 08:22) [13]
    Это самое "не двигается" называется "клиентское приложение не реагирует на события пользовательского ввода".

    Пользовательский ввод в шаблонном VCL-приложении осуществляется в основном кодовом потоке процесса, в котором тобой вызывается метод Work, во время исполнения которого поток не имеет возможности обрабатывать те самые события ввода.

    Простейшее решение напрашивается само собой - вынести работу с аппсервером в дополнительный кодовый поток.
 
Конференция "Corba" » Длительны операции сервера автоматизации [Delphi, Windows]
Есть новые Нет новых   [120347   +16][b:0][p:0]