Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 05.07.2012
Сообщений: 4
.NET 4.x

При нажатии кнопки запускается бесконечный цикл, и окно программы подвисает

05.07.2012, 12:56. Показов 4751. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При нажатии кнопки запускается бесконечный цикл, по мере прохождения цикла, нужно, чтобы он выводил сообщения в ListBox. Ниже привел код, что нужно исправить, чтобы заработало. В моем случае, при нажатии кнопки, окно программы зависает, пока не прекратит работать цикл.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
       
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            while (true)
            {
                
                this.ListBox1.Items.Add("Текст");
                Thread.Sleep(1000);
                
            } 
        }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.07.2012, 12:56
Ответы с готовыми решениями:

Бесконечный цикл с выходом при нажатии клавиши
Как это реализовать?

Как сделать бесконечный цикл при нажатии на кнопку
Я пробовал написать об этом в топике https://www.cyberforum.ru/windows-forms/thread1551941.html, но может я начал с сильно сложного...

Можно ли создать бесконечный цикл, из которого выходит при нажатии любой клавиши?
Можно ли создать бесконечный цикл, из которого выходит при нажатии любой клавиши на клавиатуре? Типо вот этого в обычном паскале: ...

6
 Аватар для Монфрид
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,247
05.07.2012, 13:17
ну у вас же Thread.Sleep(1000) стоит. Вы говорите основному потоку чтобы он подвис на секунду и так продолжается бесконечно. Используйте BackgroundWorker к примеру, или уберите Thread.sleep
0
0 / 0 / 0
Регистрация: 05.07.2012
Сообщений: 4
05.07.2012, 13:40  [ТС]
Дело в том, что даже если я убираю Thread.Sleep, окно программы все равно висит, я его перетащить даже не могу. Пока как по видимому полностью не исполниться цикл. А так как он бесконечный, то подвисает и больше ничего не происходит. И в ListBox ничего не выводится
0
 Аватар для Монфрид
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,247
05.07.2012, 13:47
видимо, не успевает отобразиться, потому и виснет
0
1 / 1 / 0
Регистрация: 21.03.2012
Сообщений: 33
05.07.2012, 13:50
Как уже написал Монфрид используйте BackgroundWorker, примерно так:
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 Button_Click(object sender, RoutedEventArgs e)
{
while (true)
{
backgroundWorker1.RunWorkerAsync();
} 
}
 
private void OnDoWork(object sender, DoWorkEventArgs e)
        {SetText(label1,"Текст"}
 
delegate void OnTextChange(Label labelForChange, string moreText);
        void SetText(Label labelForChange, string moreText)
        {
            if (labelForChange.InvokeRequired)
            {
                OnTextChange tsDelegate = SetText;
                labelForChange.Invoke(tsDelegate, new object[] { labelForChange, moreText });
            }
            else
            {
                label1.Text = moreText;
            }
        }
Не забудь OnDoWork подключить к backgroundWorker1.
0
0 / 0 / 0
Регистрация: 19.11.2021
Сообщений: 1
18.10.2022, 09:55
Для бесконечного цикла в WPF нужно создать фоновый поток.
Вот пример, как я решил свою задачу:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Thread thread = new Thread(Next) { IsBackground = true};
            thread.Start();
        }
 
        public void Next()
        {
            int i = 0;  
            while (true)
            {
                Dispatcher.Invoke(() => { txt.Text = i.ToString(); });
                Thread.Sleep(10);
                i++;
            }
        }
    }
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,081
Записей в блоге: 2
18.10.2022, 10:51
Цитата Сообщение от Wicker Посмотреть сообщение
Для бесконечного цикла в WPF нужно создать фоновый поток.
В современном Шарпе лучше задачу (task).
И запускать её лучше из асинхронного обработчика события (завершение инициализации или загрузки).
В асинхронном методе не будет надобности обращения к Диспетчеру, не надо замораживать поток слипом.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        public MainWindow()
        {
            Initialized += OnInitializedAsync;
            InitializeComponent();
        }
 
        private async void OnInitializedAsync(object? sender, EventArgs e)
        {
            int i = 0;
            while (true)
            {
                txt.Text = i.ToString();
                await Task.Delay(10);
                i++;
            }
        }
Можно добавить возможность отмены цикла:
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
        public MainWindow()
        {
            Initialized += (_, _) => StartLoopAsync();
            InitializeComponent();
        }
 
        // Источник токена отмены используемого для отмены вечного цикла.
        private CancellationTokenSource tokenSource = new CancellationTokenSource();
 
        // Можно вызывать по событию, кнопкой или любым другим нужны образом.
        private async void StartLoopAsync()
        {
            // Остановка предыдущего цикла.
            tokenSource.Cancel();
 
            // Создание источника токе для этого цикла
            tokenSource = new CancellationTokenSource();
            // Получение токена
            var token = tokenSource.Token;
 
            try
            {
                int i = 0;
                while (true)
                {
                    txt.Text = i.ToString();
                    await Task.Delay(10, token);
                    i++;
                }
            }
            catch
            {
                MessageBox.Show("Цикл отменён.");
            }
        }
 
        // Можно вызывать по событию, кнопкой или любым другим нужны образом.
        private void StopLoop()
        {
            // Остановка текущего цикла, если он есть.
            tokenSource.Cancel();
        }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.10.2022, 10:51
Помогаю со студенческими работами здесь

При нажатии кнопки пуск ПК запускается и тут же выключается, после этого он запускается сам
При нажатии кнопки пуск ПК запускается и тут же выключается, после этого через пару секунд он запускается сам. Выдает вот этот текст ...

Открыть новое окно при нажатии кнопки
Вот есть у меня начальное окно. На котором у меня есть кнопка, у которой есть слушатель public class Labaa2 extends JFrame { ...

Как очистить окно при нажатии кнопки?
Как при нажатии этой (фото) кнопки, очистить окно и вывести что - то другое?

Не открывается окно при нажатии кнопки в tkinter
Добрый день! Подскажите, пожалуйста, мне необходимо сделать окно с кнопками, при нажатии на них: графики, окно с информацией. Проблема с...

Компьютер запускается автоматически при включении в сеть или при нажатии кнопки фильтра
Привет всем! Подскажите что делать? Купил новый системник и вот такая проблема. Запускается автоматически при включении в сеть или при...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru