예제 #1
0
        /* Hàm tạo */
		public Algorithm(LinkedList processesList)
		{
			this.NumberOfProcess = processesList.Length();
			this.Processed = new bool[this.NumberOfProcess];

			for (int i = 0; i <= this.NumberOfProcess - 1; i++)
			{
                this.Processed[i] = false;      // tất cả các tiến trình chưa chạy
			}

			this.RemainingTime = new int[this.NumberOfProcess];
			Node head = processesList.Head;

			while (head != processesList.Tail)
			{
				this.RemainingTime[head.Number] = head.CPUBurstTime;
				head = head.Next;
			}
			this.RemainingTime[head.Number] = head.CPUBurstTime;
			this.ready = new LinkedList();
			this.arrangedProcesses = new LinkedList();
			this.Process_List = processesList;
			this.TimeLine = new int[300];
			this.ProcessingTime = 0;
			this.TotalTime = 0;
			this.gantt = new Gantt();
		}
예제 #2
0
        /* Vẽ biểu đồ Gantt, ghi kết quả lên DataGridView Output và Textbox */
        public void DrawGantt(LinkedList processesList,     // danh sách các tiến trình đã hoàn thành
                              int[] timeLine,               // 
                              LinkedList arrangedProcesses, // danh sách các tiến trình đã được sắp xếp
                              PictureBox pic,               // picture box để show ảnh
                              DataGridView dtgv,            // Datagridview Output
                              TextBox tbx                   // textbox thời gian chờ trung bình
                             )
		{
			for (int i = 1; i < dtgv.RowCount; i++)
			{
				dtgv.Rows.Clear();  // làm sạch DataGridView dtgvOuput
			}

            int index = arrangedProcesses.Length(); // số tiến trình đã được sắp xếp
            int p_num = processesList.Length();      // số lượng tiến trình đầu vào
            int[] numArray = new int[p_num];        // thời gian chờ của các tiến trình
			int width = ((int)(timeLine[index] * this.Coefficient)) + 30;
			int height = pic.Height;
			// tạo ảnh bitmap
			Bitmap image = new Bitmap(width, height, PixelFormat.Format32bppPArgb);
			// tạo font chữ
			Font font = new Font("Tahoma", 13, FontStyle.Regular, GraphicsUnit.Point, 0);
			Graphics graphics = Graphics.FromImage(image);

			// vẽ các viền trên và dưới
			graphics.DrawLine(new Pen(Brushes.Black, 1.5f), new Point(0, this.Top), new Point(width, this.Top));
			graphics.DrawLine(new Pen(Brushes.Black, 1.5f), new Point(0, this.Bottom), new Point(width, this.Bottom));
			graphics.DrawLine(new Pen(Brushes.Black, 1.5f), new Point(0, this.Top), new Point(0, this.Bottom));

			// vẽ trục thời gian
			for (int j = 0; j <= index; j++)
			{
				graphics.DrawLine(new Pen(Brushes.Black, 1.5f), new Point((int)(this.Coefficient * timeLine[j]), this.Top), 
								  new Point((int)(this.Coefficient * timeLine[j]), this.Bottom));
				// ghi các mốc thời gian
				graphics.DrawString(timeLine[j].ToString(), font, Brushes.Black, 
									(PointF)new Point((int)((this.Coefficient * timeLine[j]) - 3), this.Bottom + 2));
			}
			
            Node head = new Node();
			head = processesList.Head;	   
			Node next = new Node();
			next = arrangedProcesses.Head;
            int row_num = 0;                   // số hàng datagridview
            Point point = new Point();      // điểm nhằm ghi tên các tiến trình

            while (next != arrangedProcesses.Tail)  // chừng nào danh sách đã sắp xếp chưa hết
			{
				point = new Point((int)(this.Coefficient * (timeLine[row_num] + ((timeLine[row_num + 1] - timeLine[row_num]) / 4))), 
								   this.Top + ((-this.Top + this.Bottom) / 4));
                // ghi tên các tiến trình lên ảnh
				graphics.DrawString(next.Name.ToString(), font, Brushes.Red, (PointF)point);
				// ghi kết quả lên datagridviewOutput
				dtgv.Rows.Add();
				dtgv.Rows[row_num].Cells[0].Value = next.Name.ToString();
				dtgv.Rows[row_num].Cells[1].Value = timeLine[row_num].ToString() + " -> " + timeLine[row_num + 1].ToString();
				next = next.Next;
				row_num++;
			}

			// tiến trình cuối cùng
			point = new Point((int)(this.Coefficient * (timeLine[row_num] + ((timeLine[row_num + 1] - timeLine[row_num]) / 4))),
								   this.Top + ((-this.Top + this.Bottom) / 4));
			graphics.DrawString(next.Name.ToString(), font, Brushes.Red, (PointF)point);
			
            /* ghi kết quả lên datagridviewOutput */
			dtgv.Rows.Add();
			dtgv.Rows[row_num].Cells[0].Value = next.Name.ToString();
			dtgv.Rows[row_num].Cells[1].Value = timeLine[row_num].ToString() + " -> " + timeLine[row_num + 1].ToString();

            int arrivalTime = 0;        // thời gian tới
            int arv_num = 0;            // thời gian tới
            int total_num = 0;          // tổng thời gian chờ
			string str = null;
			
			for (int k = 0; k < p_num; k++)
			{
				row_num = 0;
				Node node1 = processesList.Head;
				while (row_num != p_num)
				{
					if (node1.Number == k)
					{
						arrivalTime = node1.ArrivalTime;
						arv_num = arrivalTime;
						break;
					}
					node1 = node1.Next;
					row_num++;
				}

                // ghi lên text box thời gian chờ trung bình
				row_num = 0;
				numArray[k] = 0;
				Node node2 = arrangedProcesses.Head;

				while (node2 != arrangedProcesses.Tail)
				{
					if (node2.Number == k)
					{
						arv_num = timeLine[row_num];
						numArray[k] += arv_num - arrivalTime;
						arrivalTime = timeLine[row_num + 1];
					}
					node2 = node2.Next;
					row_num++;
				}
				if (node2.Number == k)
				{
					arv_num = timeLine[row_num];
					numArray[k] += arv_num - arrivalTime;
				}
				str = str + numArray[k].ToString() + " + ";
				total_num += numArray[k];
			}

			// ghi kết quả lên textbox kết quả (thời gian chờ trung bình)

			str = str.Remove(str.Length - 3);
			string str2 = "(" + str;
			string[] strArray = new string[] { str2, ")/", p_num.ToString(), " = ", (((double)total_num) / ((double)p_num)).ToString() };
			str = string.Concat(strArray);
			pic.Width = width + 10;
			pic.Image = image;
			tbx.Text = str;
		}