Nic
Nic

Reputation: 93

Button unable to click when Thread.Sleep

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.

Upvotes: 5

Views: 1699

Answers (4)

CharithJ
CharithJ

Reputation: 47570

Task.Delay(10000).ContinueWith(x => 
{
    //...
});

Have a look at Task.Delay and ContinueWith.

Upvotes: 2

Fabjan
Fabjan

Reputation: 13676

You can use Windows.Forms.Timer to execute something after delay... (with no UI thread freezing). Split your code on two parts. 1. Before delay 2. After delay

public partial class form1 : Form
{
   // i used namespace to ensure that we use 'correct' Timer and we do not 
   // confuse it with System.Timers.Timer or System.Threading.Timer
   System.Windows.Forms.Timer tmrDelay;

   void SomeMethodWithDelay()
   {
       // code before delay here
       tmrDelay.Enabled = true;
       tmrDelay.Tick += Timer_Tick;
   }

   private void Timer_Tick(object sender, EventArgs e)
   {
       Thread.Sleep(5000);

       // your code here

       // disables timer to stop it
       tmrDelay.Enabled = false;
   }
}

Benefit from using Timer is that it is a native windows forms tool that was specially designed to help with this kind of problems. However you can still use modern things like Tasks, for example : Task.Factory.StartNew(() => { Thread.Sleep(5000); // your method logic here });

Upvotes: 0

Hjalmar Z
Hjalmar Z

Reputation: 1601

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.

Upvotes: 4

Maximilian Ast
Maximilian Ast

Reputation: 3499

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.

Upvotes: 2

Related Questions