• Qt/E服务器到客户端的消息传递


    前面提到的服务器最重要的功能就是对鼠标,键盘,屏幕等资源进行分配管理,尤其是要独占鼠标,键盘等设备,因此服务器要把各种底层设备消息通知到各个客户端进程,目前主流的GUI平台都无一例外采用事件驱动模型,这些消息正是其事件的主要来源,在其内部表示为QWSEvent,所有具体的消息(事件)都是其子类,下图给出了所有的消息(事件):

       

     这里面有很多事件是非常直观的,比如键盘事件,鼠标事件等,而有一些事件就不那么直观了,很难看明白,像QWSConnectedEventQWSPropertyReplyEvent等,他们有的是为了客户端和服务器之间通信的辅助性事件,比如QWSConnectedEvent,而像QWSPropertyReplyEvent,则是Qt内部管理的需要,与物理设备像鼠标,键盘,屏幕没有关系,在移植过程中也不会涉及,并且也很少直接与这些事件打交道,因此就不再深入分析了,但是这些事件的传递过程是一样的。

    这里以鼠标事件QWSMouseEvent为例来讲解,事件如何从服务器传递到客户端。我们知道服务器和客户端的通信和网络通信是一样的,必须将数据串行化才能进行传递。服务器进程将QWSEvent串行化(具体过程见前一节分析),然后发送到客户端进程,而客户端进程则进行相反的工作,依据串行化的字节序列,建立起一个QWSEvent对象实例。QWSEvent的反串行化的过程,是典型的工厂模式的应用(Qt中有很多典型的设计模式的使用范例),具体流程如下:

    Qt中有不少地方用到了工厂模式,这里使用的模式还是比较典型的,值得学习一下。

    QWSEvent *QWSEvent::factory(int type)

    {

        QWSEvent *event = 0;

    switch (type) {

    ……

        case QWSEvent::Mouse:

            event = new QWSMouseEvent;

            break;

        default:

            qCritical("QWSEvent::factory() : Unknown event type %08x!", type);

        }

        return event;

    }

  • 相关阅读:
    java异常
    Map集和
    获取每个字符出现的次数
    从1-33号球中选取6个红球,且红球数字最多重复不超过3个 从1-16号球中选取一个篮球 由红球和蓝球共同组成一个双色球号码,且红球在左边(按照升序排列),篮球在右边。
    gitlab介绍及使用
    Maven使用介绍
    IDEA集成开发环境安装git,修改代码后文件变色代表的含义
    大数据相关
    开源镜像站汇总
    MySQL配置文件详解
  • 原文地址:https://www.cnblogs.com/baizx/p/1783045.html
Copyright © 2020-2023  润新知