Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/86: Рейтинг темы: голосов - 86, средняя оценка - 4.50
2 / 2 / 1
Регистрация: 15.08.2013
Сообщений: 152

Задержка в цикле

09.02.2014, 09:17. Показов 17345. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Помогите пожалуйста разобраться:
Есть бесконечный цикл, который берет информацию через промежутки времени и сравнивает ее. В консольке я использую Threads.Sleep и это работает. Теперь перешел на Windows Forms и возникли проблемы с подвисанием формы на промежутки ожидания Threads.Sleep и это понятно. С Timer я разобраться не смог... С многопоточностю валяться ошибки... Это Код:

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO;
using System.Diagnostics;
 
namespace CSWD
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            while (true)
            {
                double ds1 = OprMesto();
                label1.Text = Convert.ToString(ds1); // первое показание
                Thread.Sleep(5000);                       // через пять секунд
                double ds2 = OprMesto();              
                label2.Text = Convert.ToString(ds2); // второе показание  
                Application.DoEvents();
                                                   // далее они сравниваются и происходит действие 
                                                   //в зависимости от результатов
            }
 
        }
public static double OprMesto()
        {
            DriveInfo di = new DriveInfo(@"d:");
            double Dfree = (di.AvailableFreeSpace / 1024) / 1024;
            return Dfree;
        }
Собственно форма висит 5 секунд и это плохо... Пожалуйста, подскажите варианты, и если с timerом - то можно по подробнее(с примером) как его использовать в моей программе?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.02.2014, 09:17
Ответы с готовыми решениями:

Временная задержка в цикле
Здарова,нужно сделать задержку в цикле for для отрисовки трапеции,которая двигается вдоль линии. System.Threading.Thread.Sleep(50); не...

Задержка в цикле
Имеется цикл, в котором отрисовываются линии, соединяющие вершины графа. К примеру, у меня 5 вершин, их нужно соединить дугами динамически,...

Задержка в цикле на С
Доброго времени суток! Подскажите как в консольном Борланде на С сделать пацзц в цикле, что бы выводимая информация была читабельна?

32
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.02.2014, 14:53
Студворк — интернет-сервис помощи студентам
KristopherRobin, как вы думаете, форма не позволяет обращаться из другого потока просто чтоб вам жизнь усложнить или есть более адекватное объяснение?

Неужели нет более простого способа сделать паузу в методе???
я же вам уже сказал - сделайте таймер. Он на 100% покрывает любую необходимость в циклическом повторении действий. Если вы не хотите написать 3 лишние строчки - тогда нет, проще нельзя, чем то, что выше написали.
0
2 / 2 / 1
Регистрация: 15.08.2013
Сообщений: 152
09.02.2014, 15:20  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
KristopherRobin, как вы думаете, форма не позволяет обращаться из другого потока просто чтоб вам жизнь усложнить или есть более адекватное объяснение?


я же вам уже сказал - сделайте таймер. Он на 100% покрывает любую необходимость в циклическом повторении действий. Если вы не хотите написать 3 лишние строчки - тогда нет, проще нельзя, чем то, что выше написали.
Уважаемый, я сделал таймер вместо бесконечного цикла, он работает. Мне паузу в методе нужно.

Добавлено через 6 минут
Спасибо, сейчас попробую.
Кстати на меня сейчас жена как то не добро посмотрела когда я открыл почту а там куча писем с темой "ЗАДЕРЖКА В ЦИКЛЕ!" Пришлось ей кое-что объяснить

Добавлено через 12 минут
Цитата Сообщение от KristopherRobin Посмотреть сообщение
так понятней? )
C#
1
2
3
4
5
6
7
8
9
10
11
using System;
 
        void mythread()
        {
            for (int i=0; ;i++ )
            {
                textBox1.Text = i.ToString();
 
                Thread.Sleep(100);
            }
        }
Неа, не понимаю как это для своего метода применить...
0
 Аватар для KristopherRobin
146 / 143 / 11
Регистрация: 11.09.2011
Сообщений: 419
09.02.2014, 15:24
Цитата Сообщение от Psilon Посмотреть сообщение
как вы думаете, форма не позволяет обращаться из другого потока просто чтоб вам жизнь усложнить или есть более адекватное объяснение?
да я согласен, что так будет лучше и адекватнее. но зачем то же ввели это свойство CheckForIllegalCrossThreadCalls = false; видимо для особо ленивых программеров вроде меня))
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.02.2014, 15:25
KristopherRobin, нет, его ввели не для этого.

Покажите код таймера, и где в нем нужна задержка..
0
 Аватар для KristopherRobin
146 / 143 / 11
Регистрация: 11.09.2011
Сообщений: 419
09.02.2014, 15:27
dexterdx, я кажется понял. тебе нужно, чтобы ты нажал на кнопку, выполнилось какоето действие, остановилось на пять сек, выполнилось еще раз и потом совсем остановилось?

Добавлено через 29 секунд
Цитата Сообщение от Psilon Посмотреть сообщение
нет, его ввели не для этого.
а для чего тогда? : )
0
2 / 2 / 1
Регистрация: 15.08.2013
Сообщений: 152
09.02.2014, 15:39  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
KristopherRobin, нет, его ввели не для этого.

Покажите код таймера, и где в нем нужна задержка..
Вот посмотрите: таймер запускает метод srav каждые n секунд(как вы и посоветовали вместо бесконечного цикла) а в методе srav между double ds1 = oprmesto() и double ds2 = oprmesto() должна быть задержка(пауза на n секунд) и я ставлю threads.sleep которое у меня вызывает торможение формы...

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO;
using System.Diagnostics;
 
 
namespace CSWD_2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Start();
            Thread t = new Thread(srav);
            t.Name = "srav";
            t.Start();
 
        }
        private static double oprmesto()
        {
            File.Delete(@"send.bat");
            DriveInfo di = new DriveInfo(@"d:");
            double Dfree = (di.AvailableFreeSpace / 1024) / 1024;
            return Dfree;
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            timer1.Stop();
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            srav();
        }
 
        public void srav()
        {
            double ds1 = oprmesto();
            textBox1.Text = Convert.ToString(ds1);
            Thread.Sleep(10000);
            double ds2 = oprmesto();
            textBox2.Text = Convert.ToString(ds2);
        }
 
 
 
        private void button3_Click(object sender, EventArgs e)
        {
            timer1.Stop();
            Form1.ActiveForm.Close();
        }
 
    }
}
Добавлено через 4 минуты
Цитата Сообщение от KristopherRobin Посмотреть сообщение
dexterdx, я кажется понял. тебе нужно, чтобы ты нажал на кнопку, выполнилось какоето действие, остановилось на пять сек, выполнилось еще раз и потом совсем остановилось?
Почти ,только это не должно никогда останавливаться. То есть: нужно, чтобы я нажал на кнопку, выполнилась первая часть метода srav(double ds1 = oprmesto(); textBox1.Text = Convert.ToString(ds1)), остановилось на пять сек, выполнилось оставшаяся часть метода srav(double ds2 = oprmesto(); textBox2.Text = Convert.ToString(ds2)) и таймер из button1_Click продолжал запускать этот метод бесконечно пока я не нажму на другую кнопку.
0
 Аватар для KristopherRobin
146 / 143 / 11
Регистрация: 11.09.2011
Сообщений: 419
09.02.2014, 15:42
попробуй так. у мя ничо не тормозит (первый результат появится через 10 сек)
(это с таймером, я уже писал как его на форму закинуть)

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO;
using System.Diagnostics;
 
namespace CSWD
{
    public partial class Form1 : Form
    {
            double ds1 = -1;
        double ds2 = -1;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            tmrTimer.Start();
        }
 
        public  double OprMesto()
        {
            DriveInfo di = new DriveInfo(@"d:");
            double Dfree = (di.AvailableFreeSpace / 1024) / 1024;
            return Dfree;
        }
        
        private void tmrTimer_Tick(object sender, EventArgs e)
        {
            if (ds1 == -1)
            {
                ds1 = OprMesto();
                return;
            }
            else
            {
                label1.Text = ds1.ToString(); // первое показание
 
                ds2 = OprMesto();
                label2.Text = ds2.ToString(); // второе показание  
 
 
 
 
 
 
                               ds1 = -1;  //под конец "Обнуляем" все
                               ds2 = -1;
            }
        }      
    }
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.02.2014, 15:46
C#
1
2
3
4
5
6
7
8
        public async void srav()
        {
            double ds1 = oprmesto();
            textBox1.Text = Convert.ToString(ds1);
            await Task.Factory.StartNew(() => Thread.Sleep(5000));
            double ds2 = oprmesto();
            textBox2.Text = Convert.ToString(ds2);
        }
Добавлено через 43 секунды
Для корректной работы в свойствах проекта должно быть указанно: Целевая платформа .Net 4.5
0
2 / 2 / 1
Регистрация: 15.08.2013
Сообщений: 152
09.02.2014, 16:00  [ТС]
Мдам... а у меня 4 стоит... надо обновится.

Добавлено через 42 секунды
Цитата Сообщение от KristopherRobin Посмотреть сообщение
попробуй так. у мя ничо не тормозит (первый результат появится через 10 сек)
(это с таймером, я уже писал как его на форму закинуть)
Спасибо дружище, буду пробовать!

Добавлено через 4 минуты
Цитата Сообщение от Psilon Посмотреть сообщение
Для корректной работы в свойствах проекта должно быть указанно: Целевая платформа .Net 4.5
а 4.5 это ведь для Windows 7? У меня программа для XP
0
 Аватар для KristopherRobin
146 / 143 / 11
Регистрация: 11.09.2011
Сообщений: 419
09.02.2014, 16:01
Цитата Сообщение от dexterdx Посмотреть сообщение
а 4.5 это ведь для Windows 7? У меня программа для XP
на XP только .NET 4.0 пойдет, выше уже не пойдет
0
2 / 2 / 1
Регистрация: 15.08.2013
Сообщений: 152
09.02.2014, 16:21  [ТС]
Цитата Сообщение от KristopherRobin Посмотреть сообщение
на XP только .NET 4.0 пойдет, выше уже не пойдет
Остается только твой вариант буду посмотреть))

Добавлено через 13 минут
Цитата Сообщение от KristopherRobin Посмотреть сообщение
попробуй так. у мя ничо не тормозит
Не, не так... Все работает с таймером... в твоем коде нет задержки между проверками в методе srav...
нужно так:
чтобы я нажал на кнопку, выполнилась первая часть метода srav(double ds1 = oprmesto(); textBox1.Text = Convert.ToString(ds1)), остановилось на пять сек, выполнилось оставшаяся часть метода srav(double ds2 = oprmesto(); textBox2.Text = Convert.ToString(ds2)) и таймер из button1_Click продолжал запускать этот метод бесконечно пока я не нажму на другую кнопку.
у меня все работает кроме остановки...

Спасибо и на этом! Буду думать дальше...

Добавлено через 4 минуты
у меня есть консольная программа и там использую thrteads.sleep
вот текст:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for (; ; )
            {
                Console.WriteLine("Ждем 60 секунд до запуска проверки:");
                Thread.Sleep(60000);
                Console.WriteLine("Проверка запущена, ждите...");
                DriveInfo di1 = new DriveInfo(@"d:");
                double Dfree1 = (di1.AvailableFreeSpace / 1024) / 1024;
                Console.WriteLine("На диске D " + Dfree1 + " Мбайт");
                Console.WriteLine("Ждем 20 секунд до сравнения:");
                Thread.Sleep(20000);
                DriveInfo di2 = new DriveInfo(@"d:");
                double Dfree2 = (di2.AvailableFreeSpace / 1024) / 1024;
                Console.WriteLine("На диске D " + Dfree2 + " Мбайт");
                if (Dfree1 != Dfree2)
                {
                    Console.WriteLine("Диск D заполняется!");
                }
К сожалению в windows forms все сложнее - форма подвисает...
0
 Аватар для KristopherRobin
146 / 143 / 11
Регистрация: 11.09.2011
Сообщений: 419
09.02.2014, 16:33
поменяй кое что в моем коде:

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 tmrTimer_Tick(object sender, EventArgs e)
        {
            if (ds1 == -1)
            {
                //первая часть
 
                ds1 = OprMesto();
                label1.Text = ds1.ToString(); // первое показание
                return;
            }
            else
            {
                //вторая часть
 
                ds2 = OprMesto();
                label2.Text = ds2.ToString(); // второе показание
 
 
 
                //под конец нужно все обнулить
                ds1 = -1;
                ds2 = -1;
            }
        }
на форме, таймеру в свойствах поставь Enabled = false; (это чтобы он автоматом не запустился) а на кнопке которая запускает таймер сделай tmrTimer.Start(); а на кнопке которая останавливает tmrTimer.Stop();

зы первый результат появится через 5 сек

Добавлено через 9 минут
либо так - с булевым флагом
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
public partial class Form1 : Form
    {
        double ds1;
        double ds2;
 
        bool flagFirstCalc = true;
 
-------------------------//
 
private void tmrTimer_Tick(object sender, EventArgs e)
        {
            if (flagFirstCalc)
            {
                //первая часть
 
                ds1 = OprMesto();
                label1.Text = ds1.ToString(); // первое показание
 
                flagFirstCalc = false;
                return;
            }
            else
            {
                //вторая часть
 
                ds2 = OprMesto();
                label2.Text = ds2.ToString(); // второе показание
 
 
 
                //под конец ставим флаг на первое вычисление
                flagFirstCalc = true;
            }
        }
}
2
2 / 2 / 1
Регистрация: 15.08.2013
Сообщений: 152
09.02.2014, 16:37  [ТС]
Цитата Сообщение от KristopherRobin Посмотреть сообщение
поменяй кое что в моем коде:
Ха! Я кажется понял!!! В методе проверяется содержание на -1 и если да то выполняется вторая проверка. Соответсвенно он по очереди по таймеру проверяет оба условия)) Круто! Это работает!!! Спасибо дружище!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.02.2014, 16:37

Задержка в цикле
Здравствуйте, код должен по очереди выдавать результаты каждого объекта, но хотелось бы это реализовать с задержкой. На один раз я...

Задержка в цикле for
Здравствуйте. Имеется вот такая вот рабочая подпрограмма : void led_per(uint16_t n_led) { ...

Ставлю задержку на выполнение действий в цикле - задержка ставится почему то на выполнение всего скрипта
Здравствуйте! Код элементарный: $s = $_POST; $s = preg_replace('/ {2,}/',' ',$s); for ($i = 0; $i < strlen($s);...

Как програмно в цикле не доходя до конца, пропустить шаг в цикле?
Как програмно в цикле не доходя до конца, пропустить шаг в цикле?

При склеивании строк в цикле, уже на пятом цикле возникает переполнение памяти
При склеивании строк в цикле, уже на пятом цикле возникает переполнение памяти. Что не так и как правильно сделать? Не пинайте нуба! ...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru