美文网首页
【数据结构】【C#】012-队列应用:💻键盘缓冲

【数据结构】【C#】012-队列应用:💻键盘缓冲

作者: lijianfex | 来源:发表于2018-10-14 11:26 被阅读3次

C#数据结构:队列应用:键盘输入循环缓冲区问题

在操作系统中,循环队列经常用于实时应用程序。例如,当程序正在执行其他任务时,用户可以从键盘上不断键入所要输入的内容。系统在利用这种分时处理方法时,用户键入的内容不能在屏幕上立刻显示出来,直到当前正在工作的那个进程结束为止。但在这个进程执行时,系统是在不断地检查键盘状态,如果检测到用户键入了一个新的字符,就立刻把它存到系统缓冲区中,然后继续运行原来的进程。当当前工作的进程结束后,系统就从缓冲区中取出键入的字符,并按要求进行处理。这里的键盘输入缓冲区采用了循环队列。队列的特性保证了输入字符先键入、先保存、先处理的要求,循环结构又有效地限制了缓冲区的大小,并避免了假溢出问题。

【问题描述】:有两个进程同时存在于一个程序中。其中第一个进程在屏幕上连续显示字符
“A”,与此同时,程序不断检测键盘是否有输入,如果有的话,就读入用户键入的字符并
保存到输入缓冲区中。在用户输入时,键入的字符并不立即回显在屏幕上。当用户键入一个
逗号(,)或分号(;)时,表示第一个进程结束,第二个进程从缓冲区中读取那些已键入的字
符并显示在屏幕上。第二个进程结束后,程序又进入第一个进程,重新显示字符“A”,同
时用户又可以继续键入字符,直到用户输入一个分号(;)键,才结束第一个进程,同时也
结束整个程序。

键盘输入循环缓冲区算法

#include “stdio.h”
#include “conio.h”
#include “queue.h”
main()
{/*模拟键盘输入循环缓冲区*/
      char ch1, ch2;
      SeqQueue Q;
      int f;
      InitQueue (&Q); /* 队列初始化 */
      for(;;)
      {
            for(;;) /*第一个进程*/
            {
                  printf(“A”);
                  if(kbhit())
                  {
                          ch1= getch( ); /* 读取键入的字符,但屏幕上不显示 */
                          if(ch1==’;’||ch1==’,’) break; /* 第一个进程正常中断 */
                          f= EnterQueue (&Q, ch1);
                          if(f==FALSE)
                          {
                                       printf(“循环队列已满\n”);
                                      break; /* 循环队列满时,强制中断第一个进程*/
                          }
                  }
            }
            while (!IsEmpty(Q)) /*第二个进程*/
            {
                        DeleteQueue (&Q, &ch2);
                        putchar(ch2); /*显示输入缓冲区的内容*/
             }
            if(ch1==’.’) 
                  break; /*整个程序结束*/
      }
}


C#测试用例:(与上方不同!)

public class _011_QueueApplication : MonoBehaviour
{
    SeqQueue<string> queue = new SeqQueue<string>(10);
    string input = null, output = null;
    
    private void Update()
    {
        print("等待输入!");
        InputString();
    }

    


    public void InputString()
    {
        if (Input.anyKeyDown)
        {
            input = Input.inputString;

            if (queue.IsFull()) //缓冲循环队列输入已满
            {
                print("缓冲循环队列输入已满!结束缓冲输入进程");
                OutputString();
                return;
            }

            queue.Enqueue(input); //加入缓冲队列

            if (input == ";" || input == ",") //正常结束缓冲输入进程
            {
                print("遇到  ;  ,  字符正常结束缓冲输入进程");
                OutputString();
            }

            if(input == ".")
            {
                print("程序终止");
                UnityEditor.EditorApplication.isPlaying = false;
                OutputString();
            }
        }
    }


    public void OutputString()
    {
        while(!queue.IsEmpty())
        {
            output += queue.Dequeue();
        }
        print("显示缓冲输入区的字符: " + output);
    }

    
}


测试结果:


img.jpg

注:

利用队列 先进先出 的特性

相关文章

网友评论

      本文标题:【数据结构】【C#】012-队列应用:💻键盘缓冲

      本文链接:https://www.haomeiwen.com/subject/aeszaftx.html