我如何(优雅地)终止gSOAP服务器?

时间:2018-03-01 19:15:33

标签: c++ qt web-services gsoap

我有从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;
} 

1 个答案:

答案 0 :(得分:0)

从另一个线程调用soap_done(&soap)终止阻塞对accept()的调用,然后终止您的“服务”线程。它在Windows上适用于我,但在Linux上则不适用-看起来gsoap存在一些多任务处理问题。您还需要一些布尔标志,以使“正在服务”的线程知道您已将其关闭,而不仅仅是gsope中的错误。