银行家算法 C# 界面动态实现
提示:以下是本篇文章正文内容,下面案例可供参考
一、获取进程数据
- 获取数据部分,初始界面为(图1),其中max,allocation,need,avalible矩阵,均采用富文本框RichTextBox获取,其他文本框采用TextBox ,"录入数值"按钮用来填写数据后,录入数据并初始化表格界面,其中若输入数据不满足:need[i, j] == max[i, j] - allocation[i, j] 会出现提示框 MessageBox.Show(“输入数据不符合要求。”); 输入测试数据后如图2
#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类,画出来的,每次数据更新后都要重绘。以下是遇到的问题,及解决方法。
- 为了绘制图形之后不消失,就是别的窗口遮盖后,图画没有了的现象;或者是最小化后图画消失了的情况,综合难易之后,我采用把画下来的图片保存在picturebox上,原因借鉴这个文章。他虽然也讲到了在bitmap中画,然后在pictureBox中显示的方法,但是当时并不知道这个方法可以避免闪烁。
C# 画图画不出来的解决办法 - 每次需要重绘时,如何清空pictureBox里 的图片: g.Clear(Color.White); g是Graphic对象,也是参考了别人的,当时想能不能,用背景图片清空picturebox,因为这样可能就是窗口整体图案一致,但g.Clear(这里必须是颜色),就没办法解决了,所以可以看到图2窗口上有白白的很不和谐的那一片区域(就是picturebox的位置)
- picturebox刷新图像的闪烁问题解决方法,参考了两个文章:那个明白看那个,都类似,大致思路都把图绘在bitmap上,绘完之后,把bitmap赋值给picturebox,就可以解决picturebox绘图闪烁问题
C# winform 高效绘图
C#.net picturebox动画效果,刷新图像的闪烁问题解决方法 - 参考别人的文章后,发现用完之后要dispose,否则内存爆炸
b.Dispose();
b = null;
g.Dispose();
g = null;
g2.Dispose();
g2 = null; - 更换背景图中,发现图片怎么也不能完全填充窗口,如下图a,记得BackgroundImage调成Stretch,更改之后就如下图b和图c和图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,<