⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graph.h

📁 该模块包括作业调度的三个系统进程。P1、P2、P3进程功能的实现。 P1负责对用户作业预输入处理
💻 H
📖 第 1 页 / 共 4 页
字号:
M_G_DISPLAY_READY_QUEUE()
{
    int i,color;
    PCB *h;
    h = READY_QUEUE->p_next;
    /* 就绪队列原则上可以无限多,但在显示上最多只能显示15个进程*/
    for(i=0;i<15;i++)
    {
        /* 如果该位置有进程存在*/
        if(h!=NULL)
        {
            /* 则显示进程的颜色*/
            color = h->p_color;
            h=h->p_next;
        }
        else
            /* 如果该位置无进程存在,则显示为背景颜色*/
            color = 0;
        /* 调用显示一个进程的函数来显示进程*/
        M_G_DISPLAY_OR_CLEAN_ONE_PCB_IN_READY_QUEUE(i,color);
    }
}

/****************************************************************************
模块名称:  辅助模块
函 数 名:  M_G_DISPLAY_OR_CLEAN_ONE_PCB_IN_READY_QUEUE
功    能:  单独显示一个就绪队列中的进程
入口参数:  int index 要显示的进程在进程队列中的序号
            int color 要显示的颜色值
出口参数:  无
调用关系:  进程管理函数调用
编    者:  蔡晓跃(AP0106338)
编写日期:  2003-10-17
*****************************************************************************/
M_G_DISPLAY_OR_CLEAN_ONE_PCB_IN_READY_QUEUE(int index,int color)
{
    setfillstyle(1,color);
    bar(ready_left+index*(ready_width/15)+1,ready_top+1,ready_left+(index+1)*(ready_width/15),ready_top+ready_height-1);
}

/****************************************************************************
模块名称:  辅助模块
函 数 名:  M_G_MOVE_JOB_FROM_READY_QUEUE_TO_CPU
功    能:  显示进程从就绪队列移动到CPU上
入口参数:  无(默认以当前运行的进程)
出口参数:  无
调用关系:  进程管理调用
编    者:  蔡晓跃(AP0106338)
编写日期:  2003-10-17
*****************************************************************************/
M_G_MOVE_JOB_FROM_READY_QUEUE_TO_CPU()
{
    char *buf;
    int size;
    G_POINT ps,pe,s,m,e;
    ps.x = ready_left+1;
    ps.y = ready_top+1;
    pe.x = ps.x + ready_width/15-1;
    pe.y = ready_top+ready_height-1;

    s.x = ready_left+ready_width/15/2;
    s.y = ready_top+ready_height/2;
    m.x = s.x;
    m.y = cpu_top+cpu_height-ready_height/2;
    e.x = cpu_left+cpu_width/2;
    e.y = m.y;

    /* 计算保存图形的缓冲区的大小 */
    size = imagesize(ps.x,ps.y,pe.x,pe.y);
    /* 申请缓冲区 */
    buf = malloc(size);
    /* 保存屏幕内容 */
    getimage(ps.x,ps.y,pe.x,pe.y,buf);

    M_G_DISPLAY_READY_QUEUE();
    /* 调用移动方块自定义函数*/
    G_MOVE_RECTANGLE_BASE_MIDDLE_POINT(ps,pe,s,m,buf);
    G_MOVE_RECTANGLE_BASE_MIDDLE_POINT(ps,pe,m,e,buf);
    /* 显示进程已到达CPU */
    M_G_DISPLAY_OR_CLEAN_JOB_IN_CPU(RUNNING_QUEUE->p_next->p_color);

    free(buf);
}

/****************************************************************************
模块名称:  辅助模块
函 数 名:  M_G_MOVE_JOB_FROM_CPU_TO_READY_QUEUE
功    能:  显示进程从CPU上移动到就绪队列
入口参数:  无(默认以当前运行的进程)
出口参数:  无
调用关系:  进程管理调用
编    者:  蔡晓跃(AP0106338)
编写日期:  2003-10-17
*****************************************************************************/
M_G_MOVE_JOB_FROM_CPU_TO_READY_QUEUE()
{
    char *buf;
    int size;
    G_POINT ps,pe,s,m1,m2,m3,e;
    ps.x = cpu_left+(cpu_width-ready_width/15)/2;
    ps.y = cpu_top+(cpu_height-ready_height);
    pe.x = ps.x + ready_width/15-1;
    pe.y = ps.y+ready_height-1;

    s.x = cpu_left+cpu_width/2;
    s.y = cpu_top+cpu_height-ready_height/2;
    m1.x = (cpu_left+cpu_width+system_left)/2;
    m1.y = s.y;
    m2.x = m1.x;
    m2.y = ready_top+ready_height+ready_height/2+1;
    m3.x = ready_left+(ready_width/15)*(READY_QUEUE->p_tick-1 + 0.5);
    m3.y = m2.y;
    e.x = m2.x;
    e.y = ready_top+ready_height/2;

    /* 计算保存图形的缓冲区的大小 */
    size = imagesize(ps.x,ps.y,pe.x,pe.y);
    /* 申请缓冲区 */
    buf = malloc(size);
    /* 保存屏幕内容 */
    getimage(ps.x,ps.y,pe.x,pe.y,buf);
    /* 显示进程没有占用CPU */
    M_G_DISPLAY_OR_CLEAN_JOB_IN_CPU(0);
    /*显示移动的过程 */
    G_MOVE_RECTANGLE_BASE_MIDDLE_POINT(ps,pe,s,m1,buf);
    G_MOVE_RECTANGLE_BASE_MIDDLE_POINT(ps,pe,m1,m2,buf);
    G_MOVE_RECTANGLE_BASE_MIDDLE_POINT(ps,pe,m2,m3,buf);
    G_MOVE_RECTANGLE_BASE_MIDDLE_POINT(ps,pe,m3,e,buf);

    free(buf);
}

/****************************************************************************
模块名称:  辅助模块
函 数 名:  M_G_DISPLAY_OR_CLEAN_JOB_IN_CPU
功    能:  显示或清除进程占用CPU的情况
入口参数:  int color 占用CPU进程的进程颜色
出口参数:  无
调用关系:  进程管理调用
编    者:  蔡晓跃(AP0106338)
编写日期:  2003-10-17
*****************************************************************************/
M_G_DISPLAY_OR_CLEAN_JOB_IN_CPU(int color)
{
    setfillstyle(1,color);
        bar(cpu_left+1,cpu_top+21,cpu_left+cpu_width-1,cpu_top+cpu_height-1);
}

/****************************************************************************
模块名称:  辅助模块
函 数 名:  M_G_DISPLAY_OR_CLEAN_DATA_FROM_MEMORY_TO_OUTPUT_BUF
功    能:  显示数据从用户存储区流向输出井
入口参数:  int mmindex 数据从哪个内存页表流出(内存按页管理)
            int outindex 数据流向输出井的哪个道
            int color 要显示的颜色值
出口参数:  无
调用关系:  进程管理调用
编    者:  蔡晓跃(AP0106338)
编写日期:  2003-10-17
*****************************************************************************/
M_G_DISPLAY_OR_CLEAN_DATA_FROM_MEMORY_TO_OUTPUT_BUF(int mmindex,int outindex,int color)
{
    G_POINT s,m1,m2,m3,e;
    /* 先计算画线过程的各个关键坐标*/
    s.x = userbuf_left-1;
    s.y = userbuf_top + mmindex*(userbuf_height/30) + 1;
    m1.x = (sysbuf_left+sysbuf_width+userbuf_left)/2;
    m1.y = s.y;
    m2.x = m1.x;
    m2.y = (out_top+out_height+sysbuf_top)/2;
    m3.x = out_left+(out_width/10)/2+outindex*out_width/10;
    m3.y = m2.y;
    e.x = m3.x;
    e.y = out_top+out_height+1;
    /* 调用自定义函数画线*/
    G_DRAW_LINE_BY_INCREASE(s,m1,color);
    G_DRAW_LINE_BY_INCREASE(m1,m2,color);
    G_DRAW_LINE_BY_INCREASE(m2,m3,color);
    G_DRAW_LINE_BY_INCREASE(m3,e,color);
}

/****************************************************************************
模块名称:  辅助模块
函 数 名:  M_G_DISPLAY_OUTPUT_QUEUE
功    能:  刷新显示输出井作业的情况
入口参数:  无
出口参数:  无
调用关系:  被P3调用
编    者:  蔡晓跃(AP0106338)
编写日期:  2003-10-17
*****************************************************************************/
M_G_DISPLAY_OUTPUT_QUEUE()
{
    int i,c;
    JCB *h;
    h = J_OUTPUT_JOB_HEAD->j_next;
    for(i=0;i<10;i++)
    {
        if(h!=NULL)
        {
            c = h->j_color;
            h = h->j_next;
        }
        else
            c = 0;
        M_G_DISPLAY_OR_CLEAN_ONE_JOB_IN_OUTPUT_QUEUE(i,c);
    }
}

/****************************************************************************
模块名称:  辅助模块
函 数 名:  M_G_DISPLAY_OR_CLEAN_ONE_JOB_IN_OUTPUT_QUEUE
功    能:  显示或清除一个输出井作业
入口参数:  int index 指该作业位于输出井的哪个位置
            int color 要显示或清除的颜色值
出口参数:  无
调用关系:  被P3调用
编    者:  蔡晓跃(AP0106338)
编写日期:  2003-10-17
*****************************************************************************/
M_G_DISPLAY_OR_CLEAN_ONE_JOB_IN_OUTPUT_QUEUE(int index,int color)
{
    setfillstyle(1,color);
    bar(out_left+index*(out_width/10)+1,out_top+1,out_left+(index+1)*(out_width/10),out_top+out_height-1);
}

/****************************************************************************
模块名称:  辅助模块
函 数 名:  M_G_DISPLAY_OR_CLEAN_DATA_FROM_OUTPUT_BUF_TO_SYSTEM_BUF
功    能:  显示或清除数据从输出井流向系统存储区
入口参数:  int color 要显示或清除的颜色值
出口参数:  无
调用关系:  被P3调用
编    者:  蔡晓跃(AP0106338)
编写日期:  2003-10-17
*****************************************************************************/
M_G_DISPLAY_OR_CLEAN_DATA_FROM_OUTPUT_BUF_TO_SYSTEM_BUF(int color)
{
    G_POINT s,e;
    s.x = out_left+out_width/10/2;
    s.y = out_top+out_height+1;
    e.x = s.x;
    e.y = sysbuf_top-1;
    G_DRAW_LINE_BY_INCREASE(s,e,color);
}

/****************************************************************************
模块名称:  辅助模块
函 数 名:  M_G_DISPLAY_OR_CLEAN_DATA_FROM_SYSTEM_BUF_TO_PRINTER
功    能:  显示或清除数据从系统存储区输出到打印机上
入口参数:  int color 要显示或清除的颜色值
出口参数:  无
调用关系:  被P3调用
编    者:  蔡晓跃(AP0106338)
编写日期:  2003-10-17
*****************************************************************************/
M_G_DISPLAY_OR_CLEAN_DATA_FROM_SYSTEM_BUF_TO_PRINTER(int color)
{
    G_POINT s,m1,m2,e;
    s.x = sysbuf_left- 1;
    s.y = sysbuf_top+sysbuf_height/4/2;
    m1.x = (printer_left+printer_width + sysbuf_left)/2;
    m1.y = s.y;
    m2.x = m1.x;
    m2.y = printer_mid_top;
    e.x = printer_left+printer_width+2;
    e.y = m2.y;
    G_DRAW_LINE_BY_INCREASE(s,m1,color);
    G_DRAW_LINE_BY_INCREASE(m1,m2,color);
    G_DRAW_LINE_BY_INCREASE(m2,e,color);
}

/****************************************************************************
模块名称:  辅助模块
函 数 名:  M_G_DISPLAY_SYSTEM_PROCESS
功    能:  刷新显示系统进程的状态
入口参数:  无
出口参数:  无
调用关系:  进程管理函数调用
编    者:  蔡晓跃(AP0106338)
编写日期:  2003-10-17
*****************************************************************************/
M_G_DISPLAY_SYSTEM_PROCESS()
{
    /* 独个刷新系统进程状态 */
    M_G_DISPLAY_ONE_SYSTEM_PROCESS_STATUS(0,"P1",0,P_INPUT_PROCESS->p_status);
    M_G_DISPLAY_ONE_SYSTEM_PROCESS_STATUS(1,"P2",0,P_JOB_SCHEDUL->p_status);
    M_G_DISPLAY_ONE_SYSTEM_PROCESS_STATUS(2,"P3",0,P_OUTPUT_PROCESS->p_status);
    M_G_DISPLAY_ONE_SYSTEM_PROCESS_STATUS(3,&_superwait_[0],2,P_PROCESS_SUPERWAIT->p_status);
}

/****************************************************************************
模块名称:  辅助模块
函 数 名:  M_G_DISPLAY_ONE_SYSTEM_PROCESS_STATUS
功    能:  显示一个系统进程的状态
入口参数:  int index 要显示的是哪个系统进程
            char *n 进程的名称
            int len 显示的进程名称的长度(为0时表示是P1P2P3,不为0时表示是"悬挂"进程)
            PState s 要显示的进程的状态
出口参数:  无
调用关系:  进程管理函数调用
编    者:  蔡晓跃(AP0106338)
编写日期:  2003-10-17
*****************************************************************************/
M_G_DISPLAY_ONE_SYSTEM_PROCESS_STATUS(int index,char *n,int len,PState s)
{
    int bcolor,tcolor,i;
    char *st;
    bcolor = 0;
    if(s == Running)
    {
        /* 如果进程状态是运行状的,则表蓝色底色和黄色前景来显示*/
        bcolor = blue_color;
        tcolor = yellow_color;
        st = &_running_[0];
    }
    else if(s == Ready)
    {
        /* 如果进程状态是就绪的,则表黑色底色和黄色前景来显示*/
        st = &_ready_[0];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -