银行家算法 C# 动态界面实现

银行家算法 C# 界面动态实现


提示:以下是本篇文章正文内容,下面案例可供参考

一、获取进程数据

  1. 获取数据部分,初始界面为(图1),其中max,allocation,need,avalible矩阵,均采用富文本框RichTextBox获取,其他文本框采用TextBox ,"录入数值"按钮用来填写数据后,录入数据并初始化表格界面,其中若输入数据不满足:need[i, j] == max[i, j] - allocation[i, j] 会出现提示框 MessageBox.Show(“输入数据不符合要求。”); 输入测试数据后如图2

图1图二

 #region 获取数据
        private void button2_Click_1(object sender, EventArgs e)
        {
   
            n = int.Parse(tb_n.Text);//进程数
            m = int.Parse(tb_m.Text);//资源数 建议1~6,否则印象美观
            //初始化Max
            for (int i = 0; i < n; i++)
            {
   
                string lineStr = rtb_max.Lines[i];
                string[] b = new string[m];
                b = lineStr.Split();
                int j = b.Length;
                for (int k = 0; k < j; k++)
                {
   
                    max[i, k] = int.Parse(b[k]);
                }
            }
            //初始化Allocation
            for (int i = 0; i < n; i++)
            {
   
                string lineStr = rtb_allo.Lines[i];
                string[] b = new string[m];
                b = lineStr.Split();
                int j = b.Length;
                for (int k = 0; k < j; k++)
                {
   
                    allocation[i, k] = int.Parse(b[k]);
                }
            }
            //初始化Need
            for (int i = 0; i < n; i++)
            {
   
                string lineStr = rtb_need.Lines[i];
                string[] b = new string[m];
                b = lineStr.Split();
                int j = b.Length;
                for (int k = 0; k < j; k++)
                {
   
                    need[i, k] = int.Parse(b[k]);
                }
            }
            //初始化Avaliable
            string[] s = new string[m];
            string Str = rtb_aval.Lines[0];
            s = Str.Split();
            for (int k = 0; k < m; k++)
            {
   
                available[k] = int.Parse(s[k]);
            }

            //监测数据输入是否合法need[i, j] == max[i, j] - allocation[i, j]
            for (int i = 0; i < n; i++)
            {
   
                for (int j = 0; j < m; j++)
                {
   
                    if (need[i, j] != max[i, j] - allocation[i, j])
                        MessageBox.Show("输入数据不符合要求。");
                }
            }

            Finish = new bool[n];//初始化Finish[i] =false,表示各进程都未访问过,用来表示表格中finish列的值
            Work = new int[m];//初始化work[]矩阵,值为available[],因为DrawCharts()函数的work+available列的数据就是work[]的值
            for (int i = 0; i < n; i++)
            {
   
                Finish[i] = false;
            }
            for (int i = 0; i < m; i++)
            {
   
                Work[i] = available[i];
            }
            DrawCharts();//初始化原始数据得到的表格
        }

二、界面部分

界面部分最难受,因为我也感觉很丑,但头痛的不只是它老土的外观,遇到好多问题。这个表格大部分是用C#的winform 中的Graphic类,画出来的,每次数据更新后都要重绘。以下是遇到的问题,及解决方法。

  1. 为了绘制图形之后不消失,就是别的窗口遮盖后,图画没有了的现象;或者是最小化后图画消失了的情况,综合难易之后,我采用把画下来的图片保存在picturebox上,原因借鉴这个文章。他虽然也讲到了在bitmap中画,然后在pictureBox中显示的方法,但是当时并不知道这个方法可以避免闪烁。
    C# 画图画不出来的解决办法
  2. 每次需要重绘时,如何清空pictureBox里 的图片: g.Clear(Color.White); g是Graphic对象,也是参考了别人的,当时想能不能,用背景图片清空picturebox,因为这样可能就是窗口整体图案一致,但g.Clear(这里必须是颜色),就没办法解决了,所以可以看到图2窗口上有白白的很不和谐的那一片区域(就是picturebox的位置)
  3. picturebox刷新图像的闪烁问题解决方法,参考了两个文章:那个明白看那个,都类似,大致思路都把图绘在bitmap上,绘完之后,把bitmap赋值给picturebox,就可以解决picturebox绘图闪烁问题
    C# winform 高效绘图
    C#.net picturebox动画效果,刷新图像的闪烁问题解决方法
  4. 参考别人的文章后,发现用完之后要dispose,否则内存爆炸
    b.Dispose();
    b = null;
    g.Dispose();
    g = null;
    g2.Dispose();
    g2 = null;
  5. 更换背景图中,发现图片怎么也不能完全填充窗口,如下图a,记得BackgroundImage调成Stretch,更改之后就如下图b和图c和图d

在这里插入图片描述
图a图b在这里插入图片描述图d
6. 以下代码中注释部分,是代码过程中试错部分,看了没啥用的,直接跳过就好(所有代码的注释部分都不用看)

 #region 初始化表格
        void DrawCharts() {
   
            Bitmap b = new Bitmap(1200, 600);
            Graphics g = Graphics.FromImage(b);
            //pB = pictureBox1;
            //Graphics g = this.CreateGraphics();
            //Graphics g = pictureBox1.CreateGraphics();
            g.Clear(Color.White);
            Rectangle r1;

            //左一列
            r1 = new Rectangle(0, 0, 60, 20);
            g.DrawRectangle(penBlack, r1);
            g.DrawString("资源情况", myfont, BrushBlack, r1, format);
            r1 = new Rectangle(0, 20, 60, 20);
            g.DrawRectangle(penBlack, r1);
            g.DrawString("进程", myfont, BrushBlack, r1, format);
            for (int i = 0; i < n; i++)
            {
   
                r1 = new Rectangle(0, i * 20 + 40, 60, 20);
                g.DrawRectangle(penBlack, r1);
                g.DrawString("进程 " + i, myfont, BrushBlack, r1, format);
            }

            //上一行
            for (int i = 0; i < 4; i++)
            {
   
                r1 = new Rectangle(60 + i * (40 * m), 0, 40 * m, 20);
                g.DrawRectangle(penBlack, r1);
                g.DrawString(word[i], myfont, BrushBlack, r1, format);
            }
            r1 = new Rectangle(60 + 4 * (40 * m), 0, 40, 40);
            g.DrawRectangle(penBlack, r1);
            g.DrawString(word[4], myfont, BrushBlack, r1, format);

            //上二行
            for (int i = 0; i < 4 * m; i++)
            {
   
                r1 = new Rectangle(60 + i * 40,<
  • 7
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值