📄 form1.cs
字号:
{
//检测
if ( CheckTaskItem(txtAdd.Text) )
lstTask.Items.Add(txtAdd.Text);
getItemRunTime(txtAdd.Text);
}
#endregion
# region 加载任务列表
private void btnLoadTask_Click(object sender, System.EventArgs e)
{
ofiledlg.ShowDialog();
if (File.Exists(ofiledlg.FileName))
{
try
{
using (StreamReader sr = new StreamReader(ofiledlg.FileName))
{
String strTaskItem;
if(sr.ReadLine() !="多批道处理作业调度模拟程序作业列表文件.") return;
lstTask.Items.Clear();
while ((strTaskItem = sr.ReadLine()) != null)
{
lstTask.Items.Add(strTaskItem);
}
sr.Close();
}
}
catch (Exception ee)
{
Console.WriteLine("The file could not be read:");
Console.WriteLine(ee.Message);
}
}
}
#endregion
private void Form1_Load(object sender, System.EventArgs e)
{
}
# region 返回任务列表
private void btnBack_Click(object sender, System.EventArgs e)
{
pnlResult.Visible=false;
pnlTask.Visible=true;
}
#endregion
# region 输出计算结果
private void btnTextOut_Click(object sender, System.EventArgs e)
{
sfiledlg.ShowDialog();
if(sfiledlg.FileName!="")
{
using (StreamWriter sw = new StreamWriter(sfiledlg.FileName))
{
sw.WriteLine("多批道处理模拟程序.");
sw.WriteLine("");
sw.WriteLine("作业列表:");
for(int i=0 ; i<lstTask.Items.Count ; i++)
{
sw.WriteLine(lstTask.Items[i].ToString());
}//for
sw.WriteLine("");
sw.WriteLine("运行结果:");
sw.WriteLine(txtResult.Text);
sw.Close();
}//using
}
}
#endregion
#region 计算结果
private void btnCompute_Click(object sender, System.EventArgs e)
{
ArrayEarly();
ComputeQueue();
pnlTask.Visible=false;
pnlResult.Visible=true;
}
#endregion
# region 相关算法
# region bool CheckTaskItem(string strItem) 检测作业合法性
//主要检测有括号和":"以及名称
private bool CheckTaskItem(string strItem)
{
//首先检测'(',')'和':'是否存在于这个字符串中
if(strItem.IndexOf("(")<=0 || strItem.IndexOf(")")<=0 || strItem.IndexOf(":")<=0)
return false;
//检测任务名称长度是否为0
if(strItem.Substring(0,strItem.IndexOf("("))=="")
return false;
try
{
string strstarttime=strItem.Substring(strItem.IndexOf("(")+1,strItem.IndexOf(":")-strItem.IndexOf("(")-1);
if(strstarttime.Length!=4) return false;
//Console.WriteLine(strstarttime);
int istarttimeh=Convert.ToInt32(strstarttime.Substring(0,2));
if (istarttimeh>23 || istarttimeh<0) return false;
//Console.WriteLine(istarttimeh);
int istarttimem=Convert.ToInt32(strstarttime.Substring(2,2));
if (istarttimem>59 || istarttimem<0) return false;
//Console.WriteLine(istarttimem);
int iruntime=Convert.ToInt32(strItem.Substring(strItem.IndexOf(":")+1,strItem.IndexOf(")")-strItem.IndexOf(":")-1));
if (iruntime<0) return false;
//Console.WriteLine(iruntime);
}
catch
{
return false;
}
//else
return true;
}
#endregion
#region int getItemStartTimeh(string strItem) 得到作业开始时间小时
private int getItemStartTimeh(string strItem)
{
int istartTimeh=Convert.ToInt32(strItem.Substring(strItem.IndexOf("(")+1,2));
return istartTimeh;
}
#endregion
#region int getItemStartTimem(string strItem) 得到作业开始时间分钟
private int getItemStartTimem(string strItem)
{
int istartTimem=Convert.ToInt32(strItem.Substring(strItem.IndexOf("(")+3,2));
return istartTimem;
}
#endregion
#region int getItemRunTime(string strItem) 得到作业预计运行时间
private int getItemRunTime(string strItem)
{
int irunTime=Convert.ToInt32(strItem.Substring(strItem.IndexOf(":")+1,strItem.IndexOf(")")-strItem.IndexOf(":")-1));
return irunTime;
}
#endregion
#region string getItemTitle(string strItem) 得到作业名称
private string getItemTitle(string strItem)
{
if(CheckTaskItem(strItem))
return strItem.Substring(0,strItem.IndexOf("("));
else
return "";
}
#endregion
#region bool ArrayEarly() 作业按时间大小排序
private bool ArrayEarly()
{
for ( int i=0; i<lstTask.Items.Count -1; i++)
{
for(int j=i +1 ; j<lstTask.Items.Count ; j++)
{
if(Compare(i,j)==1)
{
string strTemp=lstTask.Items[j].ToString();
lstTask.Items[j]=lstTask.Items[i];
lstTask.Items[i]=strTemp;
}
else if(Compare(i,j)==-1)
{
if(getItemRunTime(lstTask.Items[i].ToString())>getItemRunTime(lstTask.Items[j].ToString()))
{
string strTemp=lstTask.Items[j].ToString();
lstTask.Items[j]=lstTask.Items[i];
lstTask.Items[i]=strTemp;
}
}
}
}
return true;
}
#endregion
#region int Compare(int iWork1,int iWork2) 比较某两个作业提交时间那个短
//0 iWork1 earlier
//1 iWork2 earlier
//-1 same
private int Compare(int iWork1,int iWork2)
{
string strWork1=lstTask.Items[iWork1].ToString();
string strWork2=lstTask.Items[iWork2].ToString();
int istratTimeh1=getItemStartTimeh(strWork1);
int istratTimeh2=getItemStartTimeh(strWork2);
int istratTimem1=getItemStartTimem(strWork1);
int istratTimem2=getItemStartTimem(strWork2);
if(istratTimeh1<istratTimeh2)
return 0;
else if (istratTimeh1>istratTimeh2)
return 1;
else
{
if (istratTimem1<istratTimem2)
return 0;
else if(istratTimem1>istratTimem2)
return 1;
else
return -1;
}
//return true;
}
#endregion
#region void ComputeQueue() 开始计算
private void ComputeQueue()
{
int [] startTimeh=new int[lstTask.Items.Count];
int [] startTimem=new int[lstTask.Items.Count];
int [] waitTime=new int[lstTask.Items.Count];
int [] runTime=new int[lstTask.Items.Count];
double T=0;
double W=0;
//double [] lright=new double[lstTask.Items.Count];
//for(int i = 0 ; i < lstTask.Items.Count ; i++ )
// lright[i]=i;
startTimeh[0]=getItemStartTimeh(lstTask.Items[0].ToString());
startTimem[0]=getItemStartTimem(lstTask.Items[0].ToString());
runTime[0]=getItemRunTime(lstTask.Items[0].ToString());
waitTime[0]=0;
T=runTime[0];
W=1.0;
for(int i=1 ; i<lstTask.Items.Count ; i++ )
{
startTimem[i]=startTimem[i-1] + runTime[i-1];
//Console.WriteLine(startTimem[i] + "bad" + startTimem[i] % 60);
startTimeh[i]=startTimeh[i-1] + startTimem[i] / 60;
startTimem[i]=startTimem[i] % 60;
//Console.WriteLine(startTimem[i] + "badly");
runTime[i]=getItemRunTime(lstTask.Items[i].ToString());
waitTime[i]=waitTime[i-1] + runTime[i-1] ;
if((startTimeh[i]-startTimeh[i-1])>0)
{
waitTime[i]=waitTime[i]+((startTimeh[i]-startTimeh[i-1])*60+getItemStartTimem(lstTask.Items[i].ToString())-getItemStartTimem(lstTask.Items[i-1].ToString()));
}
else
waitTime[i]=waitTime[i]-(getItemStartTimem(lstTask.Items[i].ToString())-getItemStartTimem(lstTask.Items[i-1].ToString()));
if(waitTime[i]<0)waitTime[i]=0;
if (getItemStartTimeh(lstTask.Items[i].ToString())>startTimeh[i])
{
startTimeh[i]=getItemStartTimeh(lstTask.Items[i].ToString());
startTimem[i]=getItemStartTimem(lstTask.Items[i].ToString());
waitTime[i]=0;
}
else if(getItemStartTimeh(lstTask.Items[i].ToString())==startTimeh[i])
{
if(getItemStartTimem(lstTask.Items[i].ToString())>startTimem[i])
{
startTimem[i]=getItemStartTimem(lstTask.Items[i].ToString());
}
else
{
waitTime[i]=startTimem[i]-getItemStartTimem(lstTask.Items[i].ToString());
}
}
T=T+runTime[i] + waitTime[i];
W=W + Convert.ToDouble(runTime[i] + waitTime[i])/Convert.ToDouble(runTime[i]);
}
Console.WriteLine(T);
T=T/Convert.ToDouble(lstTask.Items.Count);
W=W/Convert.ToDouble(lstTask.Items.Count);
txtResult.Text="名称|提交时间|执行时间|运行时间|等待时间\r\n";
for(int j=0 ; j<lstTask.Items.Count ; j++ )
{
//lright[j]=(Convert.ToDouble(waitTime[j])+Convert.ToDouble(runTime[j]))/Convert.ToDouble(runTime[j]);//+ lright[j]
txtResult.AppendText( getItemTitle(lstTask.Items[j].ToString())
+ "\t" + getItemStartTimeh(lstTask.Items[j].ToString()) + ":"
+ getItemStartTimem(lstTask.Items[j].ToString()) + "\t" +startTimeh[j] + ":"
+ startTimem[j] + "\t" + runTime[j] + "\t "+ waitTime[j] + "\r\n");
}
txtResult.AppendText("平均周转时间:" + T.ToString() + "\r\n");
txtResult.AppendText("平均带权周转时间:" + W.ToString() + "\r\n");
}
#endregion
#region 平均周转时间
double averageTime(int [] d,int n)
{
double daverage=0;
for(int i=0 ; i < n ; i ++)
{
daverage=daverage+ Convert.ToDouble(d[i]);
}
daverage=daverage/Convert.ToDouble(n);
return daverage;
}
#endregion
#region 带权周转时间
double averageTimeRight(int [] d , int [] dr ,int n)
{
double daverage=0;
for(int i=0 ; i < n ; i ++)
{
daverage=daverage+ (Convert.ToDouble(d[i])+ Convert.ToDouble(dr[i]))/Convert.ToDouble(dr[i]);
}
daverage=daverage/Convert.ToDouble(n);
return daverage;
}
#endregion
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -