0 / 0 / 0
Регистрация: 27.02.2012
Сообщений: 12
1

В момент Thread.Sleep приложение не отвечает

27.02.2012, 22:17. Показов 2057. Ответов 6
Метки нет (Все метки)

На форме два текстовых поля, из одного из них при нажатии на кнопку получаем значение. Затем нужно чтоб, через каждую секунду выводить (ето значение - 1) в текстовое поле, короче счет секунд. Вот написал, но при запуске и нажатии на кнопку окно виснет, до тех пор пока переменная не будет равна 0, и потом только её выводит. В чем загвоздка?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void button1_Click(object sender, EventArgs e)
        {
            int sec;
            sec = Convert.ToInt32(textBox3.Text);
 
            while (sec != 0)
            {
                if (sec == 0)
                {
                    textBox1.Text = "lol";
                }
                else
                {
                    sec--;
                    Thread.Sleep(1000);
                    textBox3.Text = Convert.ToString(sec);
                }
            }
  
        }
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.02.2012, 22:17
Ответы с готовыми решениями:

Как использовать Thread.Sleep(5000), ошибка: "Элемент "Thread" не существует в текущем контексте"
я так понимаю, что Thread.Sleep(5000); это "тормоз" процесса выполенения программы на 5 сек? А...

Thread.Sleep и lock
Что будет если вызвать Thread.Sleep() внутри блока кода lock?

Thread.Sleep не работает
Всем привет! Задача такая есть таймер который запускается каждый 30 сек и делает рассылку и...

ProgressBar связать с thread.sleep
как получать progressbar.Value в случае когда стоит задержка в 10 секунд и надо в прогресс бар...

6
Эксперт .NET
15462 / 11722 / 3079
Регистрация: 17.09.2011
Сообщений: 19,610
27.02.2012, 22:21 2
В том, что вы в цикле блокируете основной поток, в котором происходит обновление интерфейса.
Используйте для таких целей таймер. Он есть в тулбоксе.
1
0 / 0 / 0
Регистрация: 27.02.2012
Сообщений: 12
27.02.2012, 22:29  [ТС] 3
Добавил таймер и вот код. На счет tick можно чуток подробней и маленький пример.
C#
1
2
3
4
Timer t1=new Timer();
            
            t1.Enabled=true;
            t1.Interval = 1000;
0
14 / 14 / 3
Регистрация: 18.02.2011
Сообщений: 53
27.02.2012, 22:47 4
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private void button1_Click(object sender, EventArgs e)
        {
            int sec;
            sec = Int32.Parse(textBox3.Text);
 
            while (sec != 0)
            {
//                if (sec == 0)                         вроде недостижимый кусок кода ?! 
//                {                                        при sec == 0 выкинет из цикла while по условию
//                    textBox1.Text = "lol";
//                }
//                else
//                {
                    sec--;
                    Thread.Sleep(1000);
                    textBox3.Text = Convert.ToString(sec);
//                  Application.DoEvents();        можно просто добавить для обработки событий формы,
//                  но она все равно будет подвисать на секунду, ибо Thread.Sleep(1000); вешает поток 
//                  формы и она не обновляется
//                                                        
//                }
            }
  
        }
или выводить sec из метода во внешнюю переменную и обновлять так:
C#
1
2
3
4
5
private void Timer_Tick(object sender, EventArgs e)
        {
            this.textBox3.Text = text; //внешняя переменная, которой вы присваиваете значение sec в методе                        
                                         //button1_Click
        }
событие Timer_Tick проще создать путем выбора контрола (таймера) в конструкторе -> событие -> двойным щелчком на событие. иначе придется самому на него подписываться.

Thread.Sleep(1000); вообще лучше выкинуть. просто секунду крутить цикл, в котором только обновлять форму Application.DoEvents()
0
Эксперт .NET
4342 / 2007 / 387
Регистрация: 27.03.2010
Сообщений: 5,469
Записей в блоге: 1
27.02.2012, 23:03 5
Цитата Сообщение от kleenex Посмотреть сообщение
вообще лучше выкинуть. просто секунду крутить цикл, в котором только обновлять форму Application.DoEvents()
Проще создать таймер и вообще всё это выкинуть. Каким образом крутить цикл можно именно секунду?
0
14 / 14 / 3
Регистрация: 18.02.2011
Сообщений: 53
27.02.2012, 23:13 6
Casper-SC, цикл крутить все равно с помощью таймера , только вот можно использовать

C#
1
2
3
4
5
Stopwatch sWatch = new Stopwatch();
sWatch.Start();
while (sWatch.ElapsedMilliseconds <= 1000)
   Application.DoEvents();
sWatch.Stop();
просто для понимания, но не совсем правильно.
0
Эксперт .NET
4342 / 2007 / 387
Регистрация: 27.03.2010
Сообщений: 5,469
Записей в блоге: 1
27.02.2012, 23:23 7
Думаю так сойдёт автору темы.
Form1.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using System;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        Timer timer;
        int counter;
 
        public Form1()
        {
            InitializeComponent();
 
            timer = new Timer();
            timer.Interval = 1000;
            timer.Tick += new EventHandler(Timer_Tick);
        }
 
        void Timer_Tick(object sender, EventArgs e)
        {
            if (counter == 0)
                ((Timer)sender).Stop();
            infoLabel.Text = counter--.ToString();
        }
 
        private void StartButton_Click(object sender, EventArgs e)
        {
            if (!timer.Enabled)
            {
                if (!int.TryParse(startValueTextBox.Text, out counter))
                {
                    MessageBox.Show(this, "Введено неверное значение");
                    startValueTextBox.SelectAll();
                    startValueTextBox.Focus();
                    return;
                }
 
                timer.Start();
            }
            else
            {
                timer.Stop();
                infoLabel.Text = string.Empty;
            }
        }
    }
}
Form1.Designer.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
namespace WindowsFormsApplication1
{
    partial class Form1
    {
        /// <summary>
        /// Требуется переменная конструктора.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
 
        /// <summary>
        /// Освободить все используемые ресурсы.
        /// </summary>
        /// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
 
        #region Код, автоматически созданный конструктором форм Windows
 
        /// <summary>
        /// Обязательный метод для поддержки конструктора - не изменяйте
        /// содержимое данного метода при помощи редактора кода.
        /// </summary>
        private void InitializeComponent()
        {
            this.startButton = new System.Windows.Forms.Button();
            this.startValueTextBox = new System.Windows.Forms.TextBox();
            this.infoLabel = new System.Windows.Forms.Label();
            this.SuspendLayout();
            // 
            // startButton
            // 
            this.startButton.Location = new System.Drawing.Point(48, 123);
            this.startButton.Name = "startButton";
            this.startButton.Size = new System.Drawing.Size(75, 23);
            this.startButton.TabIndex = 0;
            this.startButton.Text = "button1";
            this.startButton.UseVisualStyleBackColor = true;
            this.startButton.Click += new System.EventHandler(this.StartButton_Click);
            // 
            // startValueTextBox
            // 
            this.startValueTextBox.Location = new System.Drawing.Point(12, 12);
            this.startValueTextBox.Name = "startValueTextBox";
            this.startValueTextBox.Size = new System.Drawing.Size(260, 20);
            this.startValueTextBox.TabIndex = 1;
            // 
            // infoLabel
            // 
            this.infoLabel.AutoSize = true;
            this.infoLabel.Location = new System.Drawing.Point(13, 39);
            this.infoLabel.Name = "infoLabel";
            this.infoLabel.Size = new System.Drawing.Size(35, 13);
            this.infoLabel.TabIndex = 2;
            this.infoLabel.Text = "label1";
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284, 262);
            this.Controls.Add(this.infoLabel);
            this.Controls.Add(this.startValueTextBox);
            this.Controls.Add(this.startButton);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
            this.PerformLayout();
 
        }
 
        #endregion
 
        private System.Windows.Forms.Button startButton;
        private System.Windows.Forms.TextBox startValueTextBox;
        private System.Windows.Forms.Label infoLabel;
    }
}


Добавлено через 7 минут
Цитата Сообщение от kleenex Посмотреть сообщение
цикл крутить все равно с помощью таймера
Жесть какая-то.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.02.2012, 23:23

Странное поведение Thread.Sleep
Забавно, уже не первый раз встречаю такую вещь: делаю движение контрола по форме в цикле...

Аналог Thread.Sleep в Task
Имеется пример который запускает пару потоков с задержкой. using System; using...

Суммируется ли задержка двух Thread.Sleep
Подскажите а Thread.Sleep суммируется или нет? 240000+60000=300000 или будет 240000 ? if...

Более точная альтернатива Thread.Sleep(1)
Как подсказывает мне гугл, Thread.Sleep - это зло во плоти, атата, руки оторвут, и т.д. Раньше...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.