Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/50: Рейтинг темы: голосов - 50, средняя оценка - 4.94
139 / 60 / 13
Регистрация: 04.09.2011
Сообщений: 1,956
Записей в блоге: 1
.NET 4.x

Как прервать цикл while при нажатии на кнопку выход

09.11.2012, 09:21. Показов 10319. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я делаю программу, и мне надо когда пользователь нажмет на кнопку "начать работу!!" программа повторно выполняла действия в while, я делала вечный цикл(while(true)), но программу после первого круга прохода по цыкла зависала. Я Думаю надо что цикл while выполнял пока пользователь не нажмет на кнопку выход. Как это можно сделать?
 Комментарий модератора 
Sylar9, думай, что и как пишешь, а то так и до бана не далеко
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.11.2012, 09:21
Ответы с готовыми решениями:

Как сделать в программе выход при нажатии на кнопку?
Как с помощью mouseclicked в java сделать выход из программы при нажатии на кнопку?

Прервать цикл при нажатии определённой клавиши, а если не нажали - то продолжать его
do {int i=0; //for(int i=0;i<6;i++) printf("введите страну\n"); jj(hi.country); printf("введите данные для этой...

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

17
09.11.2012, 09:34
0
46 / 46 / 19
Регистрация: 15.03.2009
Сообщений: 178
09.11.2012, 09:35
Чтобы процесс while не подвисал, нужно запустить его в отдельном потоке.
Воспользуйся backgroundWorker.
0
09.11.2012, 09:37

Не по теме:

Как правильно писать вопросы. ч.2
http://evartist.narod.ru/text1/20.htm

1
179 / 48 / 6
Регистрация: 23.06.2011
Сообщений: 248
09.11.2012, 10:03
у тебя и интерфейс и цикл висят в одном потоке, соответственно, все выполняется по-очереди (образно говоря, как в процедурных языках - сверху вниз). Т.е. сначала ты нажал кнопку, потом запустился цикл, и после него должна быть нажата другая кнопка, только, когда цикл завершится. Чтобы параллельно выполнить оба действия, нужно запустить их в разных потоках. Можешь воспользоваться BackgroundWorker, а еще лучше почитать про потоки в хорошей книжке. Можно через System.Threading - многие говорят, что он лучше, чем worker, но в этом случае через invoke прийдется с формой общаться. В общем, если хочешь хорошо разобраться - потоки и гугл в помощь. Пары часов для охвата минимума хватит.
0
139 / 60 / 13
Регистрация: 04.09.2011
Сообщений: 1,956
Записей в блоге: 1
09.11.2012, 10:10  [ТС]
Цитата Сообщение от Eva_yk Посмотреть сообщение
Чтобы процесс while не подвисал, нужно запустить его в отдельном потоке.
Воспользуйся backgroundWorker.
это как в одельном потоке
0
139 / 60 / 13
Регистрация: 04.09.2011
Сообщений: 1,956
Записей в блоге: 1
09.11.2012, 13:44  [ТС]
smth, а можно по подробней как это сделать

 Комментарий модератора 
Не цитируйте посты целиком. Обращайтесь по нику, либо цитируйте какую-то конкретную мысль, и то, если это необходимо.
Последнее замечание


Добавлено через 3 часа 32 минуты
Подскажите плиз,как сделать два потока с помощью BackgroundWorker. Покажите на примере, если не сложно
0
179 / 48 / 6
Регистрация: 23.06.2011
Сообщений: 248
09.11.2012, 17:55
я не пользуюсь worker'ом, привык к обычным потокам.
Вот по нему пример http://msdn.microsoft.com/ru-r... kz4s1.aspx, втора ссылка из гугла.

Вспомнил, почему я его не использую - он мне по функционалу не подошел раз, только не помню уже, в чем проблема была.

Вот, нашел тут, когда сам изучал, комментариев нет, к сожалению. Если прочитаешь про потоки - поймешь, а объяснять то, чего ты еще не знаешь - только время терять. Суть в том, что в отдельном потоке раз в пол секунды отправляется в форму строка, и форма эту строку отображает. Просто так передать в форму строку нельзя, для этого используется Invoke - об этом тоже много инфы на первой-второй ссылке гугла (по запросу InvokeRequired).

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Threading;
 
namespace FormWithThreadEvents
{
    delegate void TextSendDelegate(object sender, string message);
    public partial class Form1 : Form
    {
        delegate void SendMessageCallBack(object sender, string message);
        TestThread th;
        public Form1()
        {
            InitializeComponent();
            th = new TestThread();
            th.textSend += new TextSendDelegate(th_textSend);
            th.th.Start();
        }
 
        void th_textSend(object sender, string message)
        {
            if (label1.InvokeRequired)
            {
                SendMessageCallBack cb = new SendMessageCallBack(th_textSend);
                Invoke(cb, new object[] { sender, message });
            }
            else label1.Text = sender.ToString() + " " + message;
        }
    }
 
    class TestThread
    {
        public event TextSendDelegate textSend;
        public Thread th;
 
        public TestThread()
        {
            th = new Thread(this.Run);
            th.IsBackground = true;
        }
 
        void Run()
        {
            for (int i = 0; i < 20; i++)
            {
                OnEvent(i);
                Thread.Sleep(500);
            }
        }
        void OnEvent(int i)
        {
            if (textSend != null) textSend(this, "var i is " + i.ToString());
        }
    }
}
Зы - пример высосан из пальца, я туда же еще событие пихнул, но можно и без него сделать.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.11.2012, 18:45
smth, а не проще ли тупо создать событие, а в потоке формы реагировать на событие? А передаваемую строку в EventArgs запихнуть?
0
139 / 60 / 13
Регистрация: 04.09.2011
Сообщений: 1,956
Записей в блоге: 1
09.11.2012, 18:47  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
smth,
а как проше можно сделать ?
0
179 / 48 / 6
Регистрация: 23.06.2011
Сообщений: 248
09.11.2012, 18:53
Psilon, я ж написал - пример искусственный. Что в голову пришло, то и написал. Задача стояла не "передать в форму событие", а "передать что-то из потока в форму".
1
139 / 60 / 13
Регистрация: 04.09.2011
Сообщений: 1,956
Записей в блоге: 1
09.11.2012, 21:02  [ТС]
Цитата Сообщение от smth Посмотреть сообщение
Psilon, я ж написал - пример искусственный. Что в голову пришло, то и написал. Задача стояла не "передать в форму событие", а "передать что-то из потока в форму".
правельно я понял нажол использовать делигаты ?
0
10 / 10 / 2
Регистрация: 02.11.2012
Сообщений: 65
09.11.2012, 21: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
public bool stopwhile = false;
        private void button1_Click(object sender, EventArgs e)
        {
            
            int a=0;
            stopwhile = false;
            while (true)
            { 
            if (stopwhile == false)
                {
                a+=1;
                textBox1.Text = Convert.ToString(a);
                Application.DoEvents();
                } else
                {
                break;
                }   
 
            }
        }
        
        private void button2_Click(object sender, EventArgs e)
        {
            stopwhile = true;
        }
0
179 / 48 / 6
Регистрация: 23.06.2011
Сообщений: 248
10.11.2012, 12:31
Sylar9, я теряюсь в догадках, что ты имел в виду, поэтому даже не знаю, что ответить. С другой стороны, все уже разжевано, пример дан. Больше в этой теме не буду писать, гугли
System.Threading и InvokeRequired
Приложи хоть немного усилий, тебе уже в рот все положили, осталось проглотить. Не понимаешь, в каком порядке что происходит - запусти пошаговую отладку.

Все, адиос.
0
139 / 60 / 13
Регистрация: 04.09.2011
Сообщений: 1,956
Записей в блоге: 1
11.11.2012, 17:25  [ТС]
nurz, Правельно я понял что место это
C#
1
2
3
                a+=1;
                textBox1.Text = Convert.ToString(a);
                Application.DoEvents()
Я ставлю свой код ?
0
139 / 60 / 13
Регистрация: 04.09.2011
Сообщений: 1,956
Записей в блоге: 1
11.11.2012, 18:02  [ТС]
программа работает только ее закрыть нельза и возле надписи программы пишться программа не отвичает
0
10 / 10 / 2
Регистрация: 02.11.2012
Сообщений: 65
11.11.2012, 18:34
Цитата Сообщение от Sylar9 Посмотреть сообщение
Правельно я понял что место это a+=1;
textBox1.Text = Convert.ToString(a);
Application.DoEvents()
Я ставлю свой код ?
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
public bool stopwhile;
//Кнопка 1
private void button1_Click(object sender, EventArgs e)
{
stopwhile = false;
while (true)
{ 
if (stopwhile == false)
{
 
//Тут ставите свой код
 
Application.DoEvents(); // Эту строку не трогать, это для того чтобы и другие события работали
} 
else
{
break; //Прерываем цикл
}   
}
}
//Кнопка 2, для остановки цикла
private void button2_Click(object sender, EventArgs e)
{
stopwhile = true;
}
0
139 / 60 / 13
Регистрация: 04.09.2011
Сообщений: 1,956
Записей в блоге: 1
12.11.2012, 09:51  [ТС]
nurz, Ваш способ не работает. я Понял почему подвисает программа, потому что я пользуюсь функций Sleep(); Мне надо задержать выполнение действия на 3мин. Я заметил что когда функция Sleep(); тогда и подвисание. Пробувал функцию Timer, но он почему после выхода из программы продолжает работать. Может вы мне подскажите какуе-то функцию
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.11.2012, 09:51
Помогаю со студенческими работами здесь

Закрытие формы при нажатии кнопку выход
При нажатии на кнопку,для закрытия использую следующий код: private: System::Void button1_Click_1(System::Object^ sender,...

Изменить содержимое дива при нажатии на кнопку - авторизация и выход
Допустим, у меня есть сайт. На нем есть поле для авторизации. Выглядит оно так: Это поле представляет собой див с инпутами, кнопкой и...

При нажатии на неактивную кнопку действует цикл
Происходит движение picturebox1 по оси х при нажатии на button1, но во время движения, можно нажать неактивную button2 и после движения...

Реализовать один цикл анимации при нажатии на кнопку
Что я хочу сделать. Пользователь нажимает картинку - происходит один цикл анимации и все возвращается на свои места. Как я хотел это...

Как прервать цикл при вводе 0, и начать расчет
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; int main() { setlocale(LC_ALL,...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru