Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Button unable to click when Thread.Sleep

Tags:

c#

delay

I understand that when Thread.Sleep is being executed, the buttons on my GUI are not able to be clicked on.

Is there any other ways to delay my codes from flowing yet still able to click on my buttons on the GUI?

For example right now after my codes execute Thread.Sleep(10000); and within this 10 seconds i'm not able to click on my button1 event, is there anyway that I can still click on my button1 event within these 10 seconds?

        private void displaydata_event2(object sender, EventArgs e)
    {
        txt_data.AppendText(in_data + "\n");
        string inStr;
        inStr = in_data;

        //MessageBox.Show(inStr.Length.ToString());

        if (inStr.Length == 12)
        {
            int indexOfSpace = inStr.IndexOf(' ');
            string Patient = inStr.Substring(indexOfSpace + 1);

            int rx = 0;
            int selected = 0;

            txtData1.Text = Patient;

            rx = Convert.ToInt16(Patient);
            selected = Convert.ToInt16(txt_pnorec.Text);

            if (rx != selected)
            {
                MessageBox.Show("Please check patient settings");
            }
        }
        else if (inStr.Length == 24)
        {
            label2.Text = "Patient is not selected!";
            label2.BackColor = Color.Red;
        }
        else if (inStr.Length == 10)
        {
            int indexOfSpace = inStr.IndexOf(':');
            string Temp = inStr.Substring(indexOfSpace + 1);

            txtData2.Text = Temp;

            double tempflo;
            tempflo = Convert.ToDouble(Temp);

            if (tempflo > 20)
            {
                lbl_temp.Text = "Fever";
                lbl_temp.BackColor = Color.Red;
            }
        }
        else if (inStr.Length == 9)
        {
            int indexOfSpace = inStr.IndexOf(':');
            string ECG = inStr.Substring(indexOfSpace + 1);

            txtData3.Text = ECG;
        }
        else if (inStr.Length == 19 || inStr.Length == 20)
        {
            int indexOfSpace = inStr.IndexOf(':');
            string Systolic = inStr.Substring(indexOfSpace + 1);

            txtData4.Text = Systolic;
        }
        else if (inStr.Length == 21 || inStr.Length == 22)
        {
            int indexOfSpace = inStr.IndexOf(':');
            string Diastolic = inStr.Substring(indexOfSpace + 1);

            txtData5.Text = Diastolic;
        }
        else if (inStr.Length == 16)
        {
            int indexOfSpace = inStr.IndexOf(':');
            string Pulse = inStr.Substring(indexOfSpace + 1);

            txtData6.Text = Pulse;
        }

        else if (inStr.Length == 23 || inStr.Length == 17 || inStr.Length == 27 || inStr.Length == 30 || inStr.Length == 35 || inStr.Length == 29)
        {
            lbl_bp.Text = inStr;//to display status of BP (Normal,prehypotension etc)

            string bp;

            bp = inStr;

            if (bp.Length == 23 || bp.Length == 27 || bp.Length == 31 || bp.Length == 35 || bp.Length == 30)
            {
                lbl_bp.BackColor = Color.Red;
            }
            else if (bp.Length == 17)
            {
                lbl_bp.BackColor = Color.LightGray;
            }
        }

        else if (inStr.Length == 32 || inStr.Length == 25 || inStr.Length == 34 || inStr.Length == 33 || inStr.Length == 26 || inStr.Length == 31)
        {
            int indexOfSpace = inStr.IndexOf(':');
            string Acc = inStr.Substring(indexOfSpace + 1);

            txtData7.Text = Acc;

            string test = inStr;

            if (test.Length == 25 || test.Length == 34 || test.Length == 33 || test.Length == 26)
            {
                label21.Text = "Check on patient!";
                label21.BackColor = Color.Red;
            }
            else if (test.Length == 32)
            {
                label21.Text = "";
                label21.BackColor = Color.LightGray;
            }
        }

        else
        {

        }

         if (txtData1.Text != "" && txtData2.Text != "" && txtData3.Text != "" && txtData4.Text != "" && txtData5.Text != "" && txtData6.Text != "" && txtData7.Text != "")
        {
            try
            {
                connection2.Open();
                OleDbCommand command2 = new OleDbCommand();
                command2.Connection = connection2;
                command2.CommandText = "insert into MedicalRecord (PatientNumber,FirstName,LastName,IC,Temperature,ECG,Systolic,Diastolic,Pulse) values('" + txt_pnorec.Text + "','" + txt_fnamerec.Text + "','" + txt_lnamerec.Text + "','" + txt_icrec.Text + "','" + txtData2.Text + "','" + txtData3.Text + "','" + txtData4.Text + "','" + txtData5.Text + "','" + txtData6.Text + "')";

                command2.ExecuteNonQuery();
                MessageBox.Show("Info Stored");
                connection2.Close();

                txtData1.Text = "";
                txtData2.Text = "";
                txtData3.Text = "";
                txtData4.Text = "";
                txtData5.Text = "";
                txtData6.Text = "";
                txtData7.Text = "";

                Thread.Sleep(interval);
                MessageBox.Show("Start");
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex);
            }
            txtData1.Text = "";
            txtData2.Text = "";
            txtData3.Text = "";
            txtData4.Text = "";
            txtData5.Text = "";
            txtData6.Text = "";
            txtData7.Text = "";  
        }
    }

Thanks in advance.

like image 678
Nic Avatar asked Jul 28 '15 07:07

Nic


2 Answers

There are multiple ways to achieve this. One example is to use a task with a delay:

Task.Delay(10000).ContinueWith(x => 
{
    //Place the code you want delayed here.
});

Another example could be to use a BackgroundWorker which is made for this exact purpose.

like image 51
Hjalmar Z Avatar answered Sep 29 '22 23:09

Hjalmar Z


you can use Async and Await

here is a good tutorial in combination with an GUI: https://www.youtube.com/watch?v=MCW_eJA2FeY

you need to declare your function as async

public async void Foo()
{
    ...
}

than you can use:

await Task.Delay(10000);

it will release you GUI for the whole Delay and you can use your GUI while the Delay is waiting.

like image 22
Maximilian Ast Avatar answered Sep 30 '22 01:09

Maximilian Ast