2010-10-24 10 views
2

Рассмотрим следующий в Qt, используя QtSoap LIB:Qt Получение ответа от SOAPRequest

QtSoapHttpTransport http; 
http.setHost("XXXX",3333); 
connect(&http, SIGNAL(responseReady()), this, SLOT(getResponse())); 

теперь есть метод я хочу назвать, который:

QtSoapMessage request; 
request.setMethod("test"); 
request.addMethodArgument("xxx","zzzz",xxx); 
request.addMethodArgument("xx","xx",xx); 
http.submitRequest(Request, "/api/soap"); 

теперь я хочу, чтобы иметь что-то вроде это:

QString GetTest(){ 
while(http.isBusy); // no such a thing as isbusy 
return http.getResponse().returnValue().toString();} 

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

Заранее спасибо ...

ответ

-1

Не вижу проблем. QtSoapHttpTransport reference уже имеет приятный простой пример.

Если вы хотите иметь геттер, который блокирует и возвращает только после получения ответа, выполнение активного ожидания (ваш цикл while) абсолютно не подходит.

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

class Messenger : public QObject { 
    Q_OBJECT 
public: 
    Messenger() { /* ... your initialization code with connect ... */ } 

    void sendRequest() { /* ... your sending code ... */ } 

    QString getTest() // call this from a worker thread to wait 
    {     // for a response to arrive and retrieve it 
     QMutexLocker lock(&responseMutex); 
     responseReady.wait(&responseMutex); 
     return http.getResponse().returnValue().toString(); 
    } 

public slots: 
    void getResponse() { // slot called by Qt event loop when response arrives 
     responseReady.wakeAll(); 
    } 

private: 
    QtSoapHttpTransport http; 
    QWaitCondition responseReady; 
    QMutex responseMutex; 
}; 

Обратите внимание, что эта конструкция имеет смысл только если у вас есть многопоточные приложения и нить, призывающая getTest является рабочим потоком, не событийная нити.

С другой стороны, если ваше приложение просто хочет сделать что-то с полученным откликом, есть imho нет причин, по которым вам нужен метод блокировки в первую очередь. Просто выполняйте свои действия в слоте напрямую - точно так же, как в документации Qt.

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