Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
 Аватар для meksik
202 / 171 / 67
Регистрация: 04.10.2014
Сообщений: 839

Вывод итератора цикла в отдельной строке в textBox без зависания программы

12.10.2014, 13:03. Показов 3131. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет) Меня очень сильно сбивает с толку работа с потоками, поэтому хочу на простом примере разобрать эту тему, надеюсь вы поможете. Смотрел в гугле подобные примеры, но все равно ничего не понял, хочу вот именно на своем примере разобрать.
Вот код, надо слелать так, чтоб при работе цикла программа не зависала
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
namespace WindowsFormsApplication8
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        public void Method() 
        {
            int i = 0;
            while (i < 10000) 
            {
                textBox1.Text += i.ToString() + Environment.NewLine;
                i++;
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Method();
        }
    }
}
Заранее спасибо всем)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.10.2014, 13:03
Ответы с готовыми решениями:

Sleep без зависания программы
Как выполнить sleep без зависания программы?

Вывод элементов в отдельной строке
Странная задача Дан массив -1,1,1,2,2,2,3,3 Необходимо вывести элементы в следующем порядке (Именно так) 3,3 2,2,2 1,1 -1

Копирование файлов с ProgressBar без зависания программы
Кто знает как можно копировать файлы с показом на прогрессбаре и без зависания прогаммы

18
290 / 271 / 107
Регистрация: 10.06.2011
Сообщений: 696
12.10.2014, 14:06
Используй Background Worker, например
0
 Аватар для meksik
202 / 171 / 67
Регистрация: 04.10.2014
Сообщений: 839
12.10.2014, 14:08  [ТС]
Darth Coder, это как вариант, но я хотел с примером использования Thread и делегата)

Добавлено через 29 секунд
и Invoke
0
290 / 271 / 107
Регистрация: 10.06.2011
Сообщений: 696
12.10.2014, 14:24
http://msdn.microsoft.com/ru-r... .110).aspx

Добавлено через 1 минуту
http://professorweb.ru/my/csha... /1/1_2.php
0
 Аватар для meksik
202 / 171 / 67
Регистрация: 04.10.2014
Сообщений: 839
12.10.2014, 14:31  [ТС]
Darth Coder, я не просил давать мне ссылки, видел я уже все это, мне нужно реализовать мой пример, тогда только я смогу понять что к чему

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
namespace WindowsFormsApplication8
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        public delegate void ProcessDelegate(int i);
 
 
        public void Method(int i) 
        {
            textBox1.Text += i.ToString() + Environment.NewLine;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.IsBusy != true)
            {
                backgroundWorker1.RunWorkerAsync();
            }
        }
 
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            int i = 0;
            while (i < 10000)
            {
                if (textBox1.InvokeRequired)
                {
                    textBox1.Invoke(new ProcessDelegate(Method), new object[] { i });
                }
                i++;
            }
        }
 
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("Done!");
        }
 
    }
}
сделал так, но у меня цикл бесконечный выходит

Добавлено через 1 минуту
хотя нет не бесконечный, если убавить до 100, то заканчивается, но выводит только от 0 до 14, не понимаю почему
0
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
12.10.2014, 14:36
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
namespace WindowsFormsApplication5 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }
        
        public void Method(object state) { // state - для удовлетворения сигнатуре WaitCallback
                                           // для нас бесполезно
 
            var action = new Action<int>(value => { // отделим метод, непосредственно изменяющий графику
                textBox1.Text += value + Environment.NewLine; // меняем что-то на графике
                //Application.DoEvents();
            });
 
            int i = 0;
            while (i < 10000) {
                if (InvokeRequired) { // если нам действительно требуется вызвать Invoke у формы
                                      // например, если мы обращаемся к ней из другого потока
 
                    Invoke(action, i); // для работы с формой из отдельного потока,
                                       // входим в контекст синхронизации основного потока gui,
                                       // передав метод action на исполнение + параметр i для него
 
                    //Application.DoEvents();
                    Thread.Sleep(1); // на миллисекунду прекращаем насиловать графику, чтобы
                                     // до следующего вызова Invoke у приложения была возможность,
                                     // например, перерисоваться и перемасштабироваться. можно было с
                                     // тем же успехом оставить Application.DoEvents внутри (или вне) Invoke,
                                     // чтобы заставить программу выполнить все свои рутинные дела
                                     // ДО следующего Invoke
 
                } else // иначе, вызываем наш метод в обыкновенном, синхронном режиме
                    action.Invoke(i); // то же, что и action(i) - вызываем метод action с параметром i
                                      // мне просто симметрия такой записи нравится)
 
                i++;
            }
        }
 
        private void button1_Click(object sender, EventArgs e) {
            ThreadPool.QueueUserWorkItem(Method); // вызываем долгий метод в отдельном потоке
                                                  // (из пула потоков)
        }
    }
}
останется справиться с тем, этот метод требуется останавливать перед закрытием окна
в вообще пример отвратительный: за такой код можно всякое поотрывать: какой смысл спамить на графику с такой частотой??
1
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
12.10.2014, 14:38
meksik, сейчас будет вам пример... Даже не один, а три в одном))) Немного подождите...
0
 Аватар для meksik
202 / 171 / 67
Регистрация: 04.10.2014
Сообщений: 839
12.10.2014, 14:49  [ТС]
Mikant, спасибо буду разбираться) много непонятного) а пример такой для того, чтоб реально увидеть работу фонового потока в деле)
insite2012, жду и ещё как жду)

Добавлено через 7 минут
мой вариант тоже сработал, когда убрал Environment.NewLine)
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
12.10.2014, 14:56
Лучший ответ Сообщение было отмечено meksik как решение

Решение

meksik, вот, разбирайте...
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
84
85
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.Threading.Tasks;
 
namespace ThreadsTest
{
    public partial class Form1 : Form
    {
        delegate void MyDelegate();
        public Form1()
        {
            InitializeComponent();
            btnStartDelegate.Click += new EventHandler(btnStartDelegate_Click);
            btnStartThread.Click += new EventHandler(btnStartThread_Click);
            btnStartTask.Click += new EventHandler(btnStartTask_Click);
        }
        //Запуск через класс Task
        void btnStartTask_Click(object sender, EventArgs e)
        {
            Task.Factory.StartNew(() =>
                {
                    int i = 0;
                    while (true)
                    {
                        this.BeginInvoke((Action)(() =>
                        {
                            txtResult3.Text = i.ToString();
                        }));
                        i++;
                        Thread.Sleep(100);
                    }
                });
        }
        //Запуск через класс Thread
        void btnStartThread_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(new ThreadStart(MethodForThread));
            t.IsBackground = true;
            t.Start();
        }
        //Запуск через асинхронный делеагт
        void btnStartDelegate_Click(object sender, EventArgs e)
        {
            MyDelegate del = new MyDelegate(MethodForDelegate);
            IAsyncResult itfAR = del.BeginInvoke(null, null);
        }
        //Целевой метод для делегата
        void MethodForDelegate()
        {
            int i=0;
            while (true)
            {
                this.BeginInvoke((Action)(() =>
                    {
                        txtResult1.Text = i.ToString();
                    }));
                i++;
                Thread.Sleep(100);
            }
        }
        //Целевой метод для потока
        void MethodForThread()
        {
            int i = 0;
            while (true)
            {
                this.BeginInvoke((Action)(() =>
                {
                    txtResult2.Text = i.ToString();
                }));
                i++;
                Thread.Sleep(100);
            }
        }
        
    }
}
На всякий случай вот архив с проектом.
Вложения
Тип файла: rar ThreadsTest.rar (41.4 Кб, 13 просмотров)
1
 Аватар для meksik
202 / 171 / 67
Регистрация: 04.10.2014
Сообщений: 839
12.10.2014, 15:07  [ТС]
insite2012, спасибо огромное)

Добавлено через 7 минут
insite2012, вопрос, почему с Task настолько все проще и почему он не юзается вместо Thread повсеместно?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
12.10.2014, 15:09
Цитата Сообщение от meksik Посмотреть сообщение
почему он не юзается вместо Thread повсеместно?
Он есть в .NET4.0 и выше. А если целевая платформа ниже, то его там нет. Да и знать потоковые примитивы тоже полезно.
Так же следует учесть, что в Task запускается фоновый поток (всегда). А если нужен НЕ фоновый, а основной? Тогда вот используется Thread.
1
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
12.10.2014, 15:19
insite2012,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        void btnStartTask_Click(object sender, EventArgs e) {
            Task.Factory.StartNew(() => {
                    int i = 0;
                    while (true) {
                        this.BeginInvoke((Action)(() => {
                            Debug.Assert(string.IsNullOrEmpty(txtResult3.Text) || txtResult3.Text == (i - 1).ToString());
                            txtResult3.Text = i.ToString();
                            Thread.Sleep(150); // усложним задачу
                        }));
                        i++;
                        Thread.Sleep(100);
                    }
                });
        }
то есть, после определения времени тела изменяющего метода, появляется осмысленность числа 100. что наводит на очень "нехорошие" мысли
0
 Аватар для meksik
202 / 171 / 67
Регистрация: 04.10.2014
Сообщений: 839
12.10.2014, 15:24  [ТС]
insite2012, все понятно)
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
12.10.2014, 15:26
Mikant, а к чему это?
0
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
13.10.2014, 04:46
insite2012, к тому что пропагандировать использование BeginInvoke не стоит

Добавлено через 6 минут
... в данном случае не стоит, т.к. может потянуть за собой ещё бОльшие проблемы
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
13.10.2014, 05:05
Цитата Сообщение от Mikant Посмотреть сообщение
пропагандировать использование BeginInvoke не стоит
Mikant, да вы что? Ну так просветите нас, подскажите, как вы намереваетесь обращаться к пользовательскому интерфейсу из другого потока выполнения? Вы знаете какой-то другой способ?
0
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
13.10.2014, 13:13
insite2012, да. пример выше
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
13.10.2014, 15:44
Цитата Сообщение от Mikant Посмотреть сообщение
да. пример выше
А в чем разница? В том что вы проверяете необходимость маршаллинга из дополнительного потока в поток GUI? Так это известно, но не думаю, что это так уж необходимо...
Кстати, да, обычно я тоже использую Invoke((Action){}));
просто в данном случае что-то не так набралось.
0
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
13.10.2014, 22:47
insite2012, нет, дело совсем не в InvokeRequired. разница как раз в Invoke|BeginInvoke (что, обычно, дольше набирать)
в первом случае мы получим вызов метода обновления в тот же момент, что произойдёт синхронизация, а вот во втором "никто ничего не обещает": даже последовательность вывода чисел на экран легко может быть нарушена (как я показал в примере выше): 1-3-2 - и всё будет зависеть от звёзд...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.10.2014, 22:47
Помогаю со студенческими работами здесь

Организация поиска с загрузкой результатов в ListBox без зависания программы
Здравствуйте! Использую такой код для поиска всех файлов меньше 5 мб на диске Х с последующее их записью в листбокс в формате типа...

В строке S записаны слова исходного текста, в отдельной строке S1- одно из слов, которое может быть в строке S (количество букв в S1 не превышает 10)
В строке S записаны слова исходного текста, в отдельной строке S1 - одно из слов, которое может быть в строке S (количество букв в S1 ...

Вывод двумерного массива без цикла
Мне, короче, надо выводить двумерный массив на экран при каждом нажатии клавиши. С циклом for всё проходит гладко, но сейчас у меня имеется...

Вывод массива без использования цикла на C(pure))
Какие есть мысли и/или готовые решения по сабжу ?

Рекурсия: найти количество цифр в строке S без использования оператора цикла
помогите плиз, скоро экзамен, рекурсии совергенно не понимаю, и если можно закомментируйте!! Описать рекурсивную функцию Digits(S) целого...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru