时间服务器应用程序

一个与已连接客户端共享时间对象的服务器。

时间服务器应用程序实例化了一个 MinuteTimer 对象,并将其与所有已连接的 时间客户端应用程序 共享。

使用 REP 文件定义远程对象

示例的父目录中的 REP 文件 "timemodel.rep" 用于生成两个应用程序都使用的头文件。对于此应用程序,生成的 "rep_timemodel_source.h" 文件定义了 MinuteTimerSource,这是用于实现 MinuteTimer 的子类及其它相关类的类。

TimeModel 类

timemodel.h 和 timemodel.cpp 中的 TimeModel 类实现了要共享的时间对象。它使用一个 QBasicTimer 通过调用 timerEvent 成员函数来确保时间更新。

void MinuteTimer::timerEvent(QTimerEvent *)
{
    QTime now = QTime::currentTime();
    if (now.second() == 59 && now.minute() == time.minute() && now.hour() == time.hour()) {
        // just missed time tick over, force it, wait extra 0.5 seconds
        time = time.addSecs(60);
        timer.start(60500, this);
    } else {
        time = now;
        timer.start(60000-time.second()*1000, this);
    }
    qDebug()<<"Time"<<time;
    setHour(time.hour());
    setMinute(time.minute());
    emit timeChanged();
}

共享 TimeModel 的实例

创建了 QRemoteObjectHostQRemoteObjectRegistryHost 的实例来托管一个对象并具有一个注册表以找到它。然后创建了一个 MinuteTimer 对象,通过使用 QRemoteObjectRegistryHost 对象的 enableRemoting 成员函数来共享它。

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    #if defined(Q_OS_UNIX) || defined(Q_OS_LINUX) || defined(Q_OS_QNX)
        signal(SIGINT, &unix_handler);
    #elif defined(Q_OS_WIN32)
        SetConsoleCtrlHandler((PHANDLER_ROUTINE)WinHandler, TRUE);
    #endif
    QRemoteObjectHost node(QUrl(QStringLiteral("local:replica")),QUrl(QStringLiteral("local:registry")));
    QRemoteObjectRegistryHost node2(QUrl(QStringLiteral("local:registry")));
    MinuteTimer timer;
    node2.enableRemoting(&timer);

    Q_UNUSED(timer)
    return app.exec();
}

示例项目 @ code.qt.io

另请参阅时间客户端应用程序

© 2024 Qt 公司。本文档中包含的贡献的版权属于其各自的拥有者。本文档基于自由软件基金会发布、经修改的 GNU 自由文档许可证版本 1.3 的条款提供。Qt 和相应的标志是 Finland 和/或在全世界其它国家 Qt 公司的商标。所有其他商标是它们各自所有者的财产。