我有从WSDL文件+ Qt GUI生成的gSOAP服务器。生成的代码完全正常,除了一个点导致我的进程在GUI退出后保持活动状态。 (我在Windows上部署,所以我没有信号)
我需要我的GUI保持活着(自然)所以我将服务器代理对象移动到基于QObject
的类,后者被移动到另一个QThread
,并且我通过以下方式启动它外部信号。服务器现在在其父QObject的事件循环上运行,并且工作正常。
唯一的问题是我不知道如何在退出时终止服务器。我尝试为服务器调整生成的代码(顺便说一句,这真的是一个好主意吗?)
int MySweetService::run(int port)
{ if (!soap_valid_socket(this->soap->master) && !soap_valid_socket(this->bind(NULL, port, 100)))
return this->soap->error;
for (;;) // =====> Maybe here I can put my while(module_is_running_atomic_bool) ?
{ if (!soap_valid_socket(this->accept()))
{ if (this->soap->errnum == 0) // timeout?
this->soap->error = SOAP_OK;
break;
}
if (this->serve())
break;
this->destroy();
}
return this->soap->error;
}
答案 0 :(得分:0)
从另一个线程调用soap_done(&soap)终止阻塞对accept()的调用,然后终止您的“服务”线程。它在Windows上适用于我,但在Linux上则不适用-看起来gsoap存在一些多任务处理问题。您还需要一些布尔标志,以使“正在服务”的线程知道您已将其关闭,而不仅仅是gsope中的错误。