locked
Alternative to Thread.Sleep(3000) in Windows Form? RRS feed

  • คำถาม

  • Hi everyone..

    I need someone to guide me through this. Thanks!


    while (!cond)
    {
      listBox1.Items.Add("hi there"); // line 1
      Thread.Sleep(3000); // line 2
      listBox1.Items.Add("how are you?"); //line 3
    }


    Okay, I wanted it to pause at line 2 for 3 seconds before it goes to line 3, but the Thread.Sleep(3000) function would make the UI unresponsive. Using the Stopwatch fix the unresponsiveness, but it takes up quite a bit of CPU utilization.


    Stopwatch delayWatch = new Stopwatch();
    delayWatch.Reset();

    while ( delayWatch.ElapsedMilliseconds < 3000 )
    {
      delayWatch.Start();
      Application.DoEvents();
      delayWatch.Stop();
    }


    So what's a good alternative which would make the UI responsive yet very low on CPU utilization?

    • ย้ายโดย CoolDadTx 10 มิถุนายน 2562 14:36 Winforms related
    4 กันยายน 2551 13:43

คำตอบ

  • private void timer_Tick(object sender, EventArgs e)  
    {  
       Timer theTimer = sender as Timer;  
       if(theTimer == nullreturn;  
       timer.Stop();  
       listBox1.Items.Add("some text, possibly from an array or database");  
       timer.Interval = new Random().Next(2000) + 1000; // random interval between 1000 and 3000  
       timer.Start();  

    http://www.peterRitchie.com/blog
    • แก้ไขโดย Peter Ritchie 4 กันยายน 2551 15:15 changed to code
    • ทำเครื่องหมายเป็นคำตอบโดย genyue 4 กันยายน 2551 15:54
    • ทำเครื่องหมายเป็นคำตอบโดย genyue 4 กันยายน 2551 15:54
    • ยกเลิกการทำเครื่องหมายเป็นคำตอบโดย genyue 4 กันยายน 2551 15:55
    • ทำเครื่องหมายเป็นคำตอบโดย genyue 4 กันยายน 2551 16:09
    4 กันยายน 2551 15:12

ตอบทั้งหมด

  • Take a look at the timer control.

    4 กันยายน 2551 13:53
  • Let's say I used the timer control.

    timer1.Interval = 3000;
    timer1.Start();

    It wouldn't pause for 3 seconds before it proceeds to line 3? Or is there something I missed out?
    4 กันยายน 2551 13:59
  • Use a Timer control and add lines to the listbox in the Tick event handler.
    http://www.peterRitchie.com/blog
    4 กันยายน 2551 14:08
  • As mentioned about I would use the timer.

    //Inside your function  
    Timer oTimer = new Timer(3000);  
    oTimer.Tick += new System.EventHander(TimerElapsed);  
    oTimer.Start();  
     
    //Add this method, to do your items  
    public void TimerElapsed(object sender, EventArgs e)  
    {  
      //In here perform your operation  
      //You can also stop the timer if desired  

    Mitchel Sellers, MCITP, MCPD, MCTS - http://www.mitchelsellers.com
    • เสนอเป็นคำตอบโดย Rudedog2 4 กันยายน 2551 15:11
    4 กันยายน 2551 14:10
  • while (!cond)
    {
      listBox1.Items.Add("hi there"); // line 1
      Thread.Sleep(3000); // line 2
      listBox1.Items.Add("how are you?"); //line 3
    }

    Okay, I have to make this clear. The above coding is just an example (that is not exactly what I will be doing) and the actual coding is a lot more complicated. The user using the program will be adding data to the listBox randomly (i.e. dynamic data: sometimes pauses, sometimes strings). I will use Thread.Sleep to demostrate the delays here.

    [user 1]

      listBox1.Items.Add("hi there");
      listBox1.Items.Add("how are you?");
      Thread.Sleep(2000);
      listBox1.Items.Add("okay, sure");
      Thread.Sleep(5000);
      listBox1.Items.Add("I'll get to you later");

    [user 2]

      listBox1.Items.Add("hi there");
      Thread.Sleep(2000);
      listBox1.Items.Add("hmm..;
      listBox1.Items.Add("I'll get to you later");
      listBox1.Items.Add("okay, sure");

    Problem now is, how can I let it pause in between delays (Thread.Sleep) before moving to the next line?
    • แก้ไขโดย genyue 4 กันยายน 2551 14:46 some edits
    4 กันยายน 2551 14:39
  • Okay, you're going to have to be more clear.  Are you simply simulating delays between entering two lines of data?

    You can't use Sleep like that because it causes the main GUI thread to block; which means your application will hang until Sleep returns.

    If you want to perform periodic logic (i.e. logic that occurs after a period of time, once or repeatedly) you must use a Timer object.

    If you don't think what you need is periodic logic; please explain what you're trying to accomplish.  Based on what you've described until now, Timer answers your question.
    http://www.peterRitchie.com/blog
    4 กันยายน 2551 14:53
  • Use timers, as already suggested above, to generate events.  Use varying or random timer intervals.

    Windows is event driven not procedure oriented, which your code is evolving into.  Most all of your applications "reactions" to how the user interacts with your UI should be event driven anyway.

    Rudedog

    Mark the best replies as answers. "Fooling computers since 1971."
    4 กันยายน 2551 14:54
  • Peter Ritchie said:

    Okay, you're going to have to be more clear.  Are you simply simulating delays between entering two lines of data?

    You can't use Sleep like that because it causes the main GUI thread to block; which means your application will hang until Sleep returns.

    If you want to perform periodic logic (i.e. logic that occurs after a period of time, once or repeatedly) you must use a Timer object.

    If you don't think what you need is periodic logic; please explain what you're trying to accomplish.  Based on what you've described until now, Timer answers your question.


    http://www.peterRitchie.com/blog
    Yes. I will be simulating delays between two lines of data. And I'm trying to build some sort of a macro program here.

    If this can be accomplished by using timers, I would really appreciate it if someone could post a example of how the coding would look like.
    Thank you.
    4 กันยายน 2551 15:00
  • private void timer_Tick(object sender, EventArgs e)  
    {  
       Timer theTimer = sender as Timer;  
       if(theTimer == nullreturn;  
       timer.Stop();  
       listBox1.Items.Add("some text, possibly from an array or database");  
       timer.Interval = new Random().Next(2000) + 1000; // random interval between 1000 and 3000  
       timer.Start();  

    http://www.peterRitchie.com/blog
    • แก้ไขโดย Peter Ritchie 4 กันยายน 2551 15:15 changed to code
    • ทำเครื่องหมายเป็นคำตอบโดย genyue 4 กันยายน 2551 15:54
    • ทำเครื่องหมายเป็นคำตอบโดย genyue 4 กันยายน 2551 15:54
    • ยกเลิกการทำเครื่องหมายเป็นคำตอบโดย genyue 4 กันยายน 2551 15:55
    • ทำเครื่องหมายเป็นคำตอบโดย genyue 4 กันยายน 2551 16:09
    4 กันยายน 2551 15:12
  • Thanks Peter Ritchie!

    I never thought of setting Interval within the Tick event handler, which is why I thought of using Thread.Sleep instead.
    4 กันยายน 2551 15:53
  • Use:

    Application.DoEvents();

    Thread.Sleep([TIME]);



    • แก้ไขโดย verner002 9 มิถุนายน 2562 18:25
    9 มิถุนายน 2562 18:24
  • Try this:

    Exaple:

    ...

    MessageBox.Show("Hi in time 12:00:00");

    Application.DoEvents();

    Thread.Sleep(1000);

    MessageBox.Show("Hi in time 12:00:01");

    ...

    9 มิถุนายน 2562 18:28