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

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

09.02.2014, 09:17. Просмотров 5069. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2014, 09:17
Ответы с готовыми решениями:

Временная задержка в цикле
Здарова,нужно сделать задержку в цикле for для отрисовки трапеции,которая...

Задержка программы
Мне нужно, чтобы перед тем, как картинки закрылись, они были видны еще...

Грамотная задержка
Объясню ситуацию, понял что к БД это не относится, пишу сюда. Есть...

задержка программы
нужно чтобы к textbox1 добавлялся текст "0_o" а через секунду менялся на "0" ...

Задержка мыши
Нужна вот такое на задержку мыши! using System; using...

32
KristopherRobin
143 / 139 / 11
Регистрация: 11.09.2011
Сообщений: 409
09.02.2014, 09:29 #2
запусти свою проверку в отдельном треде итогда форма подвисать не будет.
0
dexterdx
2 / 2 / 1
Регистрация: 15.08.2013
Сообщений: 152
09.02.2014, 09:32  [ТС] #3
Цитата Сообщение от KristopherRobin Посмотреть сообщение
запусти свою проверку в отдельном треде итогда форма подвисать не будет.
Уважаемый, позвольте пример, пожалуйста! Я попытался сделать так на основе другой задачи и у меня ругается программа на невозможность выполнения каких то компонентов в потоках или что компонент в другом потоке... Я не понял...
0
Psilon
Master of Orion
Эксперт .NET
5993 / 4846 / 901
Регистрация: 10.07.2011
Сообщений: 14,459
Записей в блоге: 5
Завершенные тесты: 4
09.02.2014, 09:36 #4
dexterdx, сделай таймер вместо бесконечного цикла, он по-моему форму не тормозит плюс ко всему. И не 90% проца жрет, а не больше 5%...
1
dexterdx
2 / 2 / 1
Регистрация: 15.08.2013
Сообщений: 152
09.02.2014, 09:39  [ТС] #5
Цитата Сообщение от Psilon Посмотреть сообщение
dexterdx, сделай таймер вместо бесконечного цикла, он по-моему форму не тормозит плюс ко всему. И не 90% проца жрет, а не больше 5%...
Я попробую...
Уважаемый Psilon, так же я пробовал делать таймер как задержку. я делал по примерам, но у меня не происходила задержка... В смысле данные обновлялись реал тайм одновременно... Я не разобрался с таймером. Пожалуйста - можно небольшой пример для моей программы?
0
KristopherRobin
143 / 139 / 11
Регистрация: 11.09.2011
Сообщений: 409
09.02.2014, 09:54 #6
Лучший ответ Сообщение было отмечено Psilon как решение

Решение

Если будут ошибки, то пиши их сюда.

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

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

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

Задержка в цикле
2
dexterdx
2 / 2 / 1
Регистрация: 15.08.2013
Сообщений: 152
09.02.2014, 10:41  [ТС] #7
Цитата Сообщение от KristopherRobin Посмотреть сообщение
Если будут ошибки, то пиши их сюда.
Спасибо! Разобрался с циклом-таймером. Теперь бы еще понять как сделать с помощью таймера делать задержки между событиями...
0
Psilon
Master of Orion
Эксперт .NET
5993 / 4846 / 901
Регистрация: 10.07.2011
Сообщений: 14,459
Записей в блоге: 5
Завершенные тесты: 4
09.02.2014, 10:42 #8
dexterdx, почитайте, какие свойства есть у таймера, может чего углядите. Вам так разжевали, что я даже прям не знаю что сказать...
0
dexterdx
2 / 2 / 1
Регистрация: 15.08.2013
Сообщений: 152
09.02.2014, 10:45  [ТС] #9
Цитата Сообщение от Psilon Посмотреть сообщение
dexterdx, почитайте, какие свойства есть у таймера, может чего углядите. Вам так разжевали, что я даже прям не знаю что сказать...
Я не много по другому представлял назначение таймера...
0
Psilon
Master of Orion
Эксперт .NET
5993 / 4846 / 901
Регистрация: 10.07.2011
Сообщений: 14,459
Записей в блоге: 5
Завершенные тесты: 4
09.02.2014, 10:48 #10
dexterdx, тамер периодически выполняет код, который по дабл-клику в него написал с интервалом по времени, указанным в свойствах. Я всегда понимал под таймером именно это. Не знаю, что еще можно подумать...
0
dexterdx
2 / 2 / 1
Регистрация: 15.08.2013
Сообщений: 152
09.02.2014, 11:07  [ТС] #11
Цитата Сообщение от Psilon Посмотреть сообщение
dexterdx, тамер периодически выполняет код, который по дабл-клику в него написал с интервалом по времени, указанным в свойствах. Я всегда понимал под таймером именно это. Не знаю, что еще можно подумать...
Да, это System.Windows.Forms.timer а еще есть system.timers. В моем понимании таймер нужен был не для периодического выполнения кода а для того что бы делать задержки между действиями, например однократную задержку на 10 секунд. Вот как раз не могу это сделать - задержку между проверками.
0
KristopherRobin
143 / 139 / 11
Регистрация: 11.09.2011
Сообщений: 409
09.02.2014, 11:38 #12
Цитата Сообщение от dexterdx Посмотреть сообщение
для того что бы делать задержки между действиями, например однократную задержку на 10 секунд. Вот как раз не могу это сделать - задержку между проверками.
все же попробуй запустить в новом треде
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void btnStart_Click(object sender, EventArgs e)
{
    thrdStart = new Thread(Start);
 
    thrdStart.Name = "Start";
 
    thrdStart.Start();
}
 
private void Start()
{
    //---------чото делаем--------------//
    
    Thread.Sleep(5000);  //задержка
}
Добавлено через 11 минут
если заругается на то что типа из другого треда идет доступ к контролам формы, то поставь в конструкторе формы this.CheckForIllegalCrossThreadCalls = false;. правда это не лучший вариант, а по-нормальному там слишком геморно да и я уже не помню как там это делается : )
0
dexterdx
2 / 2 / 1
Регистрация: 15.08.2013
Сообщений: 152
09.02.2014, 14:09  [ТС] #13
Не получается...
сделал так:
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();
        }
 
    }
}
Ошибка : Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'textBox1' не из того потока, в котором он был создан.
на вот это "this.CheckForIllegalCrossThreadCalls = false;" ругается.
0
KristopherRobin
143 / 139 / 11
Регистрация: 11.09.2011
Сообщений: 409
09.02.2014, 14:22 #14
Цитата Сообщение от dexterdx Посмотреть сообщение
на вот это "this.CheckForIllegalCrossThreadCalls = false;" ругается.
это надо в конструктор формы запихать
C#
1
2
3
4
5
6
public Form1()
 {
    InitializeComponent();
 
    CheckForIllegalCrossThreadCalls = false;
}
и тогда должна исчезнуть ошибка "Недопустимая операция в....."

зы, походу нужно убрать this т.к. свойство статическое

http://msdn.microsoft.com/en-us/libr...vs.110%29.aspx
0
Psilon
Master of Orion
Эксперт .NET
5993 / 4846 / 901
Регистрация: 10.07.2011
Сообщений: 14,459
Записей в блоге: 5
Завершенные тесты: 4
09.02.2014, 14:24 #15
KristopherRobin, мама говорит, что резать бензопилой сосиски опасно - давайте заклеим ей рот!!
0
insite2012
Модератор
Эксперт .NET
4849 / 3804 / 1094
Регистрация: 12.10.2013
Сообщений: 11,096
Записей в блоге: 2
09.02.2014, 14:27 #16
Вот так ничего не подвисает...
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
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;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button1.Click+=new EventHandler(button1_Click);
        }
        void button1_Click(object sender, EventArgs e)
        {
            Thread thr=new Thread(new ThreadStart(mythread));
            thr.Start();
        }
        void mythread()
        {
            for (int i=0; ;i++ )
            {
                if (textBox1.InvokeRequired)
                    textBox1.Invoke(new Action(() => textBox1.Text = i.ToString()));
                Thread.Sleep(100);
            }
        }
    }
}
0
dexterdx
2 / 2 / 1
Регистрация: 15.08.2013
Сообщений: 152
09.02.2014, 14:37  [ТС] #17
Да, this было лишним. но форма все равно висит во время Threads.Sleep...

Добавлено через 28 секунд
Буду пробовать. Спасибо!

Добавлено через 7 минут
Цитата Сообщение от insite2012 Посмотреть сообщение
Вот так ничего не подвисает...
C#
1
2
3
4
5
6
7
8
9
        void mythread()
        {
            for (int i=0; ;i++ )
            {
                if (textBox1.InvokeRequired)
                    textBox1.Invoke(new Action(() => textBox1.Text = i.ToString()));
                Thread.Sleep(100);
            }
        }
Мда... я не понимаю этот код
0
KristopherRobin
143 / 139 / 11
Регистрация: 11.09.2011
Сообщений: 409
09.02.2014, 14:38 #18
Цитата Сообщение от Psilon Посмотреть сообщение
мама говорит, что резать бензопилой сосиски опасно - давайте заклеим ей рот!!
там в каждый контрол который нужно что-то написать нужно делать что то подобное
C#
1
2
if (textBox1.InvokeRequired)
                    textBox1.Invoke(new Action(() => textBox1.Text = i.ToString()));
это еще ладно если один лебел, а если их куча?
0
dexterdx
2 / 2 / 1
Регистрация: 15.08.2013
Сообщений: 152
09.02.2014, 14:40  [ТС] #19
Неужели нет более простого способа сделать паузу в методе???
0
KristopherRobin
143 / 139 / 11
Регистрация: 11.09.2011
Сообщений: 409
09.02.2014, 14:53 #20
Цитата Сообщение от dexterdx Посмотреть сообщение
Мда... я не понимаю этот код
так понятней? )
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
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;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button1.Click+=new EventHandler(button1_Click);
 
            CheckForIllegalCrossThreadCalls = false;
        }
        void button1_Click(object sender, EventArgs e)
        {
            Thread thr=new Thread(new ThreadStart(mythread));
            thr.Start();
        }
        void mythread()
        {
            for (int i=0; ;i++ )
            {
                textBox1.Text = i.ToString();
 
                Thread.Sleep(100);
            }
        }
    }
}
1
09.02.2014, 14:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2014, 14:53

Задержка вывода надписей в лейблах
Я тут пытаюсь писать простые програмки, но не выходит правильно сделать...

Задержка между сменой pictureBox
Доброго времени суток, господа форумчане. Делаю проект часы с кукушкой для...

Задержка перед выводом текста
Здравствуйте. Как сделать так, что бы, элемент отображался по истечению...


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

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

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