使用来自Windows中其他进程的事件循环向Qt应用程序发送退出消息

时间:2013-11-12 15:13:20

标签: c++ windows qt

我使用Qt和QTcpServer创建了一个服务器。它在后台运行,不显示任何窗口,但它使用事件循环。

我的main.cpp看起来像这样:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyServer theServer;
    return a.exec();
}

如何在不诉诸TerminateProcess()的情况下通知我的服务器关闭?我只使用Windows解决方案,所以如果需要,我可以使用WINAPI函数。

2 个答案:

答案 0 :(得分:2)

根据服务器的用途,当您使用TCPServer时,您可以向其发送一条消息告诉它退出,但您可能需要验证发送该消息的人。

或者,在同一台计算机上安装一个控制器应用程序,它可以通过命名管道与服务器通信,您可以使用它来告诉它退出。

答案 1 :(得分:2)

我刚使用QLocalServer实现了它。结果很简单:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    static const char *quitSignalName = "My Service Quit Signal";

    const QStringList &args = a.arguments();
    if (args.size() == 2 && args[1] == "--shutdown") {
        // Connect to the named pipe to notify the service it needs
        // to quit. The QLocalServer will then end the event loop.
        QLocalSocket quitSignal;
        quitSignal.connectToServer(quitSignalName);
        quitSignal.waitForConnected();
        return 0;
    }

    // Listen for a quit signal, we connect the newConnection() signal
    // directly to QApplication::quit().
    QLocalServer quitSignalWatcher;
    QObject::connect(&quitSignalWatcher, SIGNAL(newConnection()), &a, SLOT(quit()));
    quitSignalWatcher.listen(quitSignalName);

    MyServer theServer;
    Q_UNUSED(theServer);

    return a.exec();
}