Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переключение между циклами 
:(
    Опции темы
terance
Дата 7.6.2010, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 10.10.2007

Репутация: нет
Всего: нет



Есть 4 кнопки и 4 отдельных цикла (по одному на каждую кнопку) . Подскажите как реализовать следующее : если первая кнопка нажата ,то выполняется 1ый цикл , если происходит нажатие какой либо другой кнопки, то 1ый цикл останавливает работу и начинает работу другой цикл .

Пишу все это дело на С#. Обьясните , как мне реализовать переход между циклами(что бы один завершался ,а другой начинался)?
PM MAIL   Вверх
Akina
Дата 8.6.2010, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Цитата(terance @  8.6.2010,  00:34 Найти цитируемый пост)
если происходит нажатие какой либо другой кнопки, то 1ый цикл останавливает работу и начинает работу другой цикл .

А по окончании работы второго первый продолжает работу? Если нет, то всё тривиально...

Код

public nCycle as integer

sub ButtonX_Press
nCycle=X
end sub

sub Cycle
do
 select case nCycle
  case 1
   call sub1
  case 2
   call sub2
'....
  case N
   call sub
  case 0
   ' ничего не делать
  case -1
   ' остановить поток цикла
end select
loop



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
terance
Дата 8.6.2010, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 10.10.2007

Репутация: нет
Всего: нет



хм...цикл быстро начинает заполнять текст бокс .как замедлить заполнение ?пытался похимичить с System.Threading.Thread.Sleep(); но при вставке в цикл функции senCommands() программа начинает висеть
Код

        public int cycleNumber;

        void sendCommands(string commandName)
        {

            for (;;)
            {
                int i=0;
                i++;
                myTextBox.Text += commandName + i;
            }
        }
        private void selectSycle()
        {
            for (; ; )
            {
                switch (cycleNumber)
                {
                    default:
                        break;
                    case 1:
                        sendCommands("движение вперед");
                        break;
                    case 2:
                        sendCommands("поворот налево");
                        break;
                }
            }
        }

        public myForm()
        {
            InitializeComponent();
        }

        private void moveForward_Click(object sender, EventArgs e)
        {
            cycleNumber=1;
            selectSycle();
        }

        private void turnLeft_Click(object sender, EventArgs e)
        {
            cycleNumber=2;
            selectSycle();
        }
    }


Это сообщение отредактировал(а) terance - 8.6.2010, 22:44
PM MAIL   Вверх
Akina
Дата 8.6.2010, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Переезжай в конкретный язык. ИМХО.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxim1000
Дата 9.6.2010, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



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

в принципе, для ручного распределения времени есть ещё нити (fibers), но есть подозрение, что там Sleep не даст желаемого результата


--------------------
qqq
PM WWW   Вверх
terance
Дата 9.6.2010, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 10.10.2007

Репутация: нет
Всего: нет



мне на msdn посоветовали сделать следующие изменения в коде 

добавить в этот кусок 
Код

 public myForm()
        {
            InitializeComponent();
        }

следующие строчки :
Код

 
            Thread Syclerun = new Thread(new ThreadStart(selectSycle));
            Syclerun.Start();

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


но при отладке приложения возникает следующая ошибка :
Код

Invalid operation in several flows: an attempt to access control 'myTextBox' not from the stream, in which it was created.




Это сообщение отредактировал(а) terance - 9.6.2010, 17:57
PM MAIL   Вверх
tol05
Дата 10.6.2010, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



я бы посоветовал использовать методы Monitor.Wait и Monitor.Pulse
неплохо описано здесь

P.S.

Цитата
    
Invalid operation in several flows: an attempt to access control 'myTextBox' not from the stream, in which it was created.


почитайте про Control.Invoke() или про Form.Invoke()

Это сообщение отредактировал(а) tol05 - 10.6.2010, 13:02


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Polesinskij
Дата 1.11.2013, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 31.10.2013

Репутация: нет
Всего: нет



на си эта концепция реализуется через парадигму обмена "посланиями". А так не знаю, я бы попробовал переменную нафиг ввести  для кнопки и наверно на иф брек поставить, а так бы и не стал программировать в такой среде где этого сделать не получиться. smile 
PM MAIL   Вверх
infarch
Дата 1.11.2013, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: 1
Всего: 1



Если нужно постепенно заполнять значениями некий текстбокс, то используйте Timer. Не будет проблем с контролами. Задайте интевал повтора и все. 
PM MAIL   Вверх
dzaraev
Дата 1.11.2013, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 12.1.2013

Репутация: нет
Всего: 1



terance, если я правильно понял вашу задачку, то вам совершенно не нужно иметь 4 цикла, достаточно одного, и просто подменять ему текущее сообщение. Затем, код у вас совершенно нерабочий, т.к. содержит в основном ошибки.
Далее по некоторым комментариям:

Цитата(terance @  8.6.2010,  21:03 Найти цитируемый пост)
пытался похимичить с System.Threading.Thread.Sleep();но при вставке в цикл функции senCommands() программа начинает висеть

Программа у вас висит хотя бы потому, что в её основном потоке выполняется бесконечный цикл. Слип, не слип - это в данном случае не важно. 


Цитата(terance @  9.6.2010,  09:06 Найти цитируемый пост)
но при отладке приложения возникает следующая ошибка :
код C#
1:
Invalid operation in several flows: an attempt to access control 'myTextBox' not from the stream, in which it was created.

Небольшой ликбез - в WinForms визуальных компонентах (наследники Control) во время выполнения всегда проверяется - из какого потока вы полезли менять контрол, и если это не основной поток (в котором изначально запускается ваше приложение), то будет вот такое исключение. Это сделано для того, чтобы поддерживать согласованное состояние внутри инфраструктуры WinForms, иначе данные контролов можно будет менять асинхронно и ваша программа очень скоро упадёт набок и задёргается. Поэтому ваш код обязан выполнять явную синхронизацию с основным UI потоком, прежде, чем сможет работать с контролами. Если вы не порождаете новых потоков, то синхронизация не нужна - вы уже внутри UI потока. Но если доступ идёт из другого потока (не UI), то необходимо оборачивать такие вызовы в делегаты и передавать методам Invoke/BeginInvoke. Эти методы отправят ваш делегат в очередь к UI потоку, а тот, когда освободится, займётся вашим делегатом.

Если у вас еще будут такие задачки\лабы и т.д., то крайне рекомендую прочитать этот цикл статей - очень доступно и подробно расписано про потоки в C#: http://www.rsdn.ru/article/dotnet/CSThreading1.xml

Я накидал  программку, решающую вашу задачу (если я правильно её понял) и прикрепил к сообщению. Будут вопросы - спрашивайте.


Присоединённый файл ( Кол-во скачиваний: 0 )
Присоединённый файл  WindowsFormsCycles.zip 7,59 Kb
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1247 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.