2

I am currently creating a CPU scheduling simulator program for my school project. Currently I'm stock with the error:

CS0122 Form1.AvgWaiting is inaccessible due to its protection level

And when i change TextBox to public from Form1Designer.cs, I get the error below:

CS0120 C# An object reference is required for the non-static field, method, or property

I have Form1.cs and a separate class for my algorithms. I will be using my algorithms to display output for my datagridview and textbox.

My Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CPU_Scheduling_Simulator
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        // set default values to comboBox

        foreach (Control cont in this.Controls)
        {
            if (cont is ComboBox)
            {
                ((ComboBox)cont).SelectedIndex = 0;
            }
        }
    }

    public void Form1_Load(object sender, EventArgs e)
    {

    }

    public void groupBox2_Enter(object sender, EventArgs e)
    {

    }

    public void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {

    }

    public void button1_Click(object sender, EventArgs e)
    {
        Close();
    }

    public void buttonGenerate_Click(object sender, EventArgs e)
    {
        dataGridView1.Rows.Clear();
        int count = int.Parse(comboBoxProcess.GetItemText(comboBoxProcess.SelectedItem));

        
        if (comboBoxProcess.SelectedIndex == -1)
            MessageBox.Show("Please select num of Process");           

        else
        {

        dataGridView1.Rows.Add(count);

            for (int i = 0; i < count; i++)
            {
            dataGridView1.Rows[i].Cells["Processes"].Value = "" + (i+1);
            }
        }
    }

    public void buttonClear_Click(object sender, EventArgs e)
    {
        foreach (Control control in this.Controls)
        {
            if (control is TextBox)
                ((TextBox)control).Text = null;
        }

        dataGridView1.Rows.Clear();
    }

    public void groupBox5_Enter(object sender, EventArgs e)
    {

    }

    public void buttonSimulate_Click(object sender, EventArgs e)
    {

        int count = int.Parse(comboBoxProcess.GetItemText(comboBoxProcess.SelectedItem));    

            int index = comboBoxAlgorithm.SelectedIndex;

            switch (index)
            {
                case 0:

                    // Process id's 
                    int[] processes = new int[count];
                    int n = processes.Length;

                    // Burst time of all processes 
                    int[] burst_time =  new int[n];
                    for (int x = 0; x < n; x++)
                        burst_time[x] = int.Parse((string)dataGridView1.Rows[x].Cells["BurstTime"].Value);


                    // Arrival time of all processes 
                    int[] arrival_time = new int[n];
                    for (int x = 0; x < n; x++)
                        arrival_time[x] = int.Parse((string)dataGridView1.Rows[x].Cells["ArrivalTime"].Value);

                    FCFS.findavgTime(processes, n, burst_time, arrival_time);

                    break;

                default:
                    MessageBox.Show("Please select an Algorithm");

                break;
            }

        
        
    }
}

}

My FCFS.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


  namespace CPU_Scheduling_Simulator
  {
public class FCFS
{
    // Function to find the waiting time for all 
    // processes 
    public static void findWaitingTime(int[] processes, int n, int[] bt, int[] wt, int[] at)
    {
        int[] service_time = new int[n];
        service_time[0] = 0;
        wt[0] = 0;

        // calculating waiting time 
        for (int i = 1; i < n; i++)
        {
            // Add burst time of previous processes 
            service_time[i] = service_time[i - 1] + bt[i - 1];

            // Find waiting time for current process = 
            // sum - at[i] 
            wt[i] = service_time[i] - at[i];

            // If waiting time for a process is in negative 
            // that means it is already in the ready queue 
            // before CPU becomes idle so its waiting time is 0 
            if (wt[i] < 0)
                wt[i] = 0;
        }
    }

    // Function to calculate turn around time 
    public static void findTurnAroundTime(int[] processes, int n, int[] bt,
                                        int[] wt, int[] tat)
    {
        // Calculating turnaround time by adding bt[i] + wt[i] 
        for (int i = 0; i < n; i++)
            tat[i] = bt[i] + wt[i];
    }

    // Function to calculate average waiting and turn-around 
    // times. 
    public static void findavgTime(int[] processes, int n, int[] bt, int[] at)
    {
        int[] wt = new int[n]; int[] tat = new int[n];

        // Function to find waiting time of all processes 
        findWaitingTime(processes, n, bt, wt, at);

        // Function to find turn around time for all processes 
        findTurnAroundTime(processes, n, bt, wt, tat);

        // Display processes along with all details 
        //Console.Write("Processes " + " Burst Time " + " Arrival Time "
        //    + " Waiting Time " + " Turn-Around Time "
        //    + " Completion Time \n");
        int total_wt = 0, total_tat = 0;
        for (int i = 0; i < n; i++)
        {
            total_wt = total_wt + wt[i];
            total_tat = total_tat + tat[i];
            int compl_time = tat[i] + at[i];

            //Console.WriteLine(i + 1 + "\t\t" + bt[i] + "\t\t"
            //    + at[i] + "\t\t" + wt[i] + "\t\t "
            //    + tat[i] + "\t\t " + compl_time);


            Form1.dataGridView1.Rows[i].Cells["Processes"].Value = i + 1;
            Form1.dataGridView1.Rows[i].Cells["BurstTime"].Value = bt[i];
            Form1.dataGridView1.Rows[i].Cells["ArrivalTime"].Value = at[i];
            Form1.dataGridView1.Rows[i].Cells["WaitingTime"].Value = wt[i];
        }

        //Console.Write("Average waiting time = "
        //    + (float)total_wt / (float)n);
        //Console.Write("\nAverage turn around time = "
        //    + (float)total_tat / (float)n);

        Form1.AvgWaiting.Text = ""+(float)total_wt / (float)n);
        Form1.AvgTurnaround.Text ""+(float)total_tat / (float)n);
    }

    // Driver code 


}

}

Also can someone link me to a working gantt chart and ready queue source code in C# so I can study it. I found one on youtube but its in Java link

Btw, thank you so much for helping a newbie like me. I know i have much to learn and it was easier to learn with all your help.

lance2k
  • 357
  • 1
  • 4
  • 14
  • Use properties.In FCFS: `public static System.Windows.Forms.DataGridView DataGridView1 {get; set; }`. `public static Decimal AvgWaiting { get; set; }`, ... – Tu deschizi eu inchid Dec 18 '20 at 20:40
  • thank you user9938, I have read about this in here from another user post but didn't fully understand it. Could you link me to some resources where i could learn more on this properties? thank you – lance2k Dec 18 '20 at 21:14
  • Here's a post: https://stackoverflow.com/questions/6709072/c-getter-setter – Tu deschizi eu inchid Dec 18 '20 at 21:55

1 Answers1

3

Form1 is the class name not an instance of that class. If you want to refer to an existing instance you need to pass the instance where is needed or retrieve it from the Application.OpenForms collection

So for example you can write this before using Form1

var f1 = Application.OpenForms.OfType<Form1>().FirstOrDefault();
if(f1 != null)
{
    // use f1 wherever you use Form1.
}

this will work if you have just one instance of Form1 opened in the same timeframe. If you have more than one instance then you need to pass the instance of the current Form1 to the FCFS method

FCFS.findavgTime(processes, n, burst_time, arrival_time, this);
break;

and

public static void findavgTime(int[] processes, int n, int[] bt, int[] at, Form1 f1)
{
     // and again use f1 instead of Form1
Steve
  • 213,761
  • 22
  • 232
  • 286
  • Thank you, almost fix it. Im only having ; and } expected error with the code below: f1.AvgWaiting.Text = ""+(float)total_wt / (float)n); f1.AvgTurnaround.Text = ""+(float)total_tat / (float)n); – lance2k Dec 18 '20 at 21:05
  • i just noticed it is missing (. – lance2k Dec 18 '20 at 21:07