📜  计算机图形学中输入设备的处理

📅  最后修改于: 2022-05-13 01:58:11.778000             🧑  作者: Mango

计算机图形学中输入设备的处理

用户可以通过它向计算机提供数据、信息或控制信号的设备称为输入设备。计算机中央处理单元 (CPU) 接受并处理数据以生成输出。例如,光笔、键盘等是事件驱动输入设备的示例。

处理事件驱动设备:处理事件驱动设备可以通过两种方式进行 -

  1. 首先进入一个轮询循环,它会检查设备的状态,直到发出事件信号。当事件发生时,循环以事件的结果退出。在高级语言中,读取终端输入经常以这种方式处理。这种技术的一个缺点是 CPU 在等待某事发生时经常处于空闲状态。
  2. 允许在事件发生时由设备传输的中断是另一种选择。通过使用中断机制,处理器在等待事件发生时可以自由地执行一些其他操作。

输入设备处理算法:系统充当依赖于设备的用户程序和可用设备之间的接口。界面程序的内部会因设备而异,而用户看到的外部将保持一致。这对用户来说太棒了,但对我们来说却是一个挑战,因为我们不能简单地提供一个算法。
考虑可用于处理输入设备的各种类型的过程。让我们考虑设备的类别。

  1. 按钮-
    按下时,按钮是发送中断的事件驱动设备。它只传达了它已作为信息被按下的事实。
  2. 挑选-
    以钢笔为代表。它是一种事件驱动的设备,可以选择显示的某些部分。
  3. 键盘-
    对于键盘模拟,例程的内部形式随后从一般情况的形式改变。这是因为2个因素。首先,通过高级语言从键盘输入似乎是采样的,而不是事件驱动机制。
  4. 定位器-
    定位器是一个采样设备,它返回某个位置的坐标。
  5. 估价师-
    评估器是一种采样设备,与定位器非常相似,但它只返回一个值。它可能是一个可以由用户设置的双或旋钮。

假设每个设备都有启用或禁用它的方法,并将通过为每个类生成一个标志来简化此过程,而不是启用和禁用单个设备。标志(设置或取消设置)定义是否启用特定类。为了更容易指定类,给它们数字名称。

1. 启用 Button 类的例程:

BEGIN
    If Class = 1 Then
    BEGIN
        // Perform all the operations needed to permit 
        // input from the button devices
        Button <-- True
    END;
    If Class = 2 Then
    BEGIN
        // Perform all the operations needed to permit 
        // input from the pick devices
        Pick <-- True
    END;
    If Class = 3 Then
    BEGIN
        // Perform all the operations needed to permit 
        // input from the keyboard
        Keyboard <-- True
    END;
    If Class = 4 Then
    BEGIN
        // Perform all the operations needed to permit 
        // input from the Loactor devices
        Loactor <-- True
    END;
    If Class = 5 Then
    BEGIN
        // Perform all the operations needed to permit 
        // input from the valuator devices
        Valuator <-- True
    END;
    AND so on
    .
    .
    .
    RETURN;
END;

2. 禁用 Button 类的例程:

BEGIN
    If Class = 1 Then
    BEGIN
        // Perform all the operations needed to prohibit 
        // input from the button devices
        Button <-- False
    END;
    If Class = 2 Then
    BEGIN
        // Perform all the operations needed to prohibit 
        // input from the pick devices
        Pick <-- False
    END;
    If Class = 3 Then
    BEGIN
        // Perform all the operations needed to prohibit 
        // input from the keyboard
        Keyboard <-- False
    END;
    If Class = 4 Then
    BEGIN
        // Perform all the operations needed to prohibit 
        // input from the Loactor devices
        Loactor <-- False
    END;
    If Class = 5 Then
    BEGIN
        // Perform all the operations needed to prohibit 
        // input from the valuator devices
        Valuator <-- False
    END;
    And so on
    .
    .
    .
    RETURN;
END;

禁用例程将类号作为输入并执行逻辑关闭此类设备所需的任何操作并将适当的设备标志更改为假。类似地,启用例程采用类号,执行所需的操作以在逻辑上打开设备,并将相关设备标志设置为真。

3. 禁用所有输入设备的例程:

BEGIN
    For Class = 1 to 5
        Do disable button(Class); 
        // calling routine 2 Above
    RETURN;
END;

处理事件:由事件驱动的设备产生中断。只要发生中断,处理器就会停止其当前工作。处理器为产生中断的设备执行中断服务程序。维修设备后,处理器恢复其旧工作。

在这里,假设一个事件队列,但可以有多个队列。提供服务(通过CPU)的意义是识别引起中断的设备并从中获取输入数据。获取此信息后,将其存储在事件队列中。
队列以先进先出的方式工作。队列的每个元素代表一个用户操作或一个事件。在队列中,插入在后端完成,删除从前端完成。

1、处理输入设备中断的算法:

BEGIN
    Disable Physical Interrupt;
    Save Status Of CPU ;
    Identify Interrupt Causing Device;
    If the device is logically enabled, Then
    BEGIN
        If event from a string Input Devivce, Then
            BEGIN
                Get the input string;
                // Add string to the queue, Described in 
                // the next algorithm
                ADD_STRING_Q(STRING, DATA);
            END
        Else
            BEGIN 
                Get the data from the device;
                // Add string to the queue, Described in 
                // the next algorithm
                ADD_EVENT_Q(CLASS, NUMBER, DATA);
            END
    END
    Restore the status of processor;
    Renable the physical Interrupt;
    RETURN
END

2. 将事件添加到队列的算法:
该算法使用函数-

ADD_EVENT_Q(CLASS, NUMBER, DATA)
BEGIN
    If Qrear = Qsize, Then
        Qrear <- 1
    Else
        Qrear <- Qrear + 1;
    If Qfront = Qrear, Then
        Return error - " Event Queue - overflow"
    // Add class of the input device to the event 
    // queue class array at rear position
    EVENT_QC[Qrear] <- Class;
    // Add the number of the input device to the 
    // event queue number array at rear position
    EVENT_QN[Qrear] <- Number;
    // Add data from the input device to the event 
    // queue data array at rear position
    EVENT_QD[Qrear] <- Data;
    If QFront <- 0, Then
        QFront <- 1;
    RETURN ;
END;

在字符串队列中,每个新字符串都被添加到字符串数组中。到达阵列末端后,回到前面位置。使用以下函数-

ADD_STRING_Q(STRING, DATA)
BEGIN
    If SQrear = SQsize, Then
        SQrear <- 1
    Else
        SQrear <- SQrear + 1
    // Add String from the input device to the 
    // String queue data array at rear position
    STRING_Q[SQrear] <- String;
    Data <- SQrear
    RETURN;
END;

如果没有事件发生或没有产生中断并且队列保持为空。