2011-12-20 7 views
0

Я пытаюсь разрешить множественный одновременный доступ клиентов к веб-сервису, позволяя клиенту делать запрос и блокировать до тех пор, пока данные не будут доступны (я делаю это так, поскольку gsoap не поддерживает уведомления)Несколько одновременных клиентов с gsoap

Мой класс webservice скомпилирован с WITH_PURE_VIRTAL, что означает, что я не могу создавать его экземпляры, так как это абстрактный класс. Таким образом, я использую один класс, построенный мной, который наследуется от класса webservice и отвечает за управление запросами webservice и webclient.

Однако, когда мой класс занят обработкой существующего клиента, я не могу получить никаких других запросов.

Я прочитал (here), что вы должны начать нить с чем-то похожее на это:

soap_serve((struct soap*)soap); 
    soap_destroy((struct soap*)soap); // dealloc C++ data 
    soap_end((struct soap*)soap); // dealloc data and clean up 
    soap_done((struct soap*)soap); // detach soap struct 
    free(soap); 

Однако, когда я изменить этот код для вызова моего класса WebService вместо этого, служить вызов не делает что-нибудь.

Я также попытался запустить новую тему внутри своих методов вызова webservice, но как только поток запускается, веб-клиент получает пустой ответ.

Есть ли у кого-нибудь предложения?

ответ

1

Если вы посмотрите на мой ответ на вопрос this, вы увидите очень простой сервер gSoap с потоками C++. Я думаю, что вам может не хватать, нужно скопировать класс службы, в моем коде строка tc = c.copy() ; // make a safe copy копирует экземпляр службы gSoap, включая контекст gSoap; эта копия передается в новый поток, так что новый поток может ответить на запрос, в то время как основной поток ожидает другого запроса.

+0

Это правильный ответ. Мне просто нужно было реализовать метод абстрактной копии, который позволил мне обрабатывать несколько клиентов. Спасибо за вход! – Daniel

Смежные вопросы