void ReportStat(VisualData visual) { var new_list = from task in tasks join vs in visual.visual on task.Name equals vs.Key select new { // 期望时间(执行时间) PredictTime = (double)task.ExecuteTime, // 实际执行时间(周转时间) ExecuteTime = (double)vs.Value.during.exec_time }; var T = (from list in new_list select list.ExecuteTime).Average(); var W = (from list in new_list select list.ExecuteTime / list.PredictTime).Average(); action(new string('-', 50)); action(string.Format("平均周转时间 = {0:f}", T)); action(string.Format("平均带权周转时间 = {0:f}", W)); }
Bitmap DrawSchd(VisualData result) { var max_time = result.visual.Values.ToList().ConvertAll(new Converter <VisualStruct, int>(a => a.during.start_time + a.during.exec_time)).Max(); Size size = new Size(VisualSettings.Margin * 2 + VisualSettings.DispTextWidth + VisualSettings.TimeSpanWidth * (max_time + 1), result.visual.Count * (VisualSettings.TaskHeight + VisualSettings.TaskSpacing) + VisualSettings.TaskBlanking + VisualSettings.TimeHeight * 2); Bitmap bitmap = new Bitmap(size.Width, size.Height); Graphics graphics = Graphics.FromImage(bitmap); graphics.Clear(Color.WhiteSmoke); { int w = 0, h = 0; var font = new Font("Microsoft Yahei", 12); var format = new StringFormat() { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Center }; var brush = new SolidBrush(Color.Black); var blue = new SolidBrush(Color.Cyan); var gray = new SolidBrush(Color.LightGray); var pen = new Pen(Color.Black); // 主体 foreach (var fk in result.visual) { w = VisualSettings.Margin; h += VisualSettings.TaskSpacing; // 任务名 graphics.DrawString(fk.Key, font, brush, new Rectangle(w, h, VisualSettings.DispTextWidth, VisualSettings.TaskHeight), format); w += VisualSettings.DispTextWidth + fk.Value.during.start_time * VisualSettings.TimeSpanWidth; var fill_rect = new Rectangle(w, h, fk.Value.during.exec_time * VisualSettings.TimeSpanWidth, VisualSettings.TaskHeight); // 任务主体 graphics.FillRectangle(gray, fill_rect); var clips = fk.Value.cpu_clips; w = VisualSettings.Margin + VisualSettings.DispTextWidth; foreach (var tp in clips) { // CPU var rt2 = new Rectangle(w + tp.Item1 * VisualSettings.TimeSpanWidth, h, tp.Item2 * VisualSettings.TimeSpanWidth, VisualSettings.TaskHeight); graphics.FillRectangle(blue, rt2); graphics.DrawRectangle(pen, rt2); } graphics.DrawRectangle(pen, fill_rect); h += VisualSettings.TaskHeight; } // 刻度 w = VisualSettings.Margin; h += VisualSettings.TaskBlanking; graphics.DrawLine(pen, w, h, size.Width - VisualSettings.Margin, h); w += VisualSettings.DispTextWidth; // 虚线 { var p = new Pen(Color.Black); p.DashPattern = new float[] { 9, 3 }; var hh = result.visual.Count * (VisualSettings.TaskHeight + VisualSettings.TaskSpacing) + VisualSettings.TaskBlanking; foreach (var i in result.switches) { var ww = w + i * VisualSettings.TimeSpanWidth; graphics.DrawLine(p, ww, 0, ww, hh); } } // 坐标 format.Alignment = StringAlignment.Center; for (int i = 0; i <= max_time; i++) { var pt = new Point(w, h); var pt1 = new Point(w, h + VisualSettings.DegreeHeight); graphics.DrawLine(pen, pt, pt1); pt.Offset(0, VisualSettings.TimeHeight + VisualSettings.TimeHeight / 2); var rt = new Rectangle(pt, Size.Empty); rt.Inflate(VisualSettings.TimeSpanWidth / 2, VisualSettings.TimeHeight / 2); rt.Inflate(-2, -2); graphics.DrawString(i.ToString(), font, brush, rt, format); w += VisualSettings.TimeSpanWidth; } } return(bitmap); }