Задать вопрос
@1bd_1l_Bari

Как реализовать: пока нажата кнопка — выполнять команду?

Доброго времени суток.
Суть : шаговый двигатель подключен к микрухе atmega, которая подключена к PC через интерфейс USART.
На компьютере написано приложение на C# , где 4 кнопки (вверх, вниз, вправо, влево). Нажимая на которые, контроллеру подаются байты: 1, 2, 3, 4. Необходимо , чтобы пока нажата кнопка (например вверх), комп посылал байт 1 постоянно на контроллер, т.е пока нажата кнопка- шаговик крутится.

Проблема: в функции, где нажимается кнопка, написал вечный цикл, который действует пока флаг == тру. Как только, отпускаем кнопку, флаг становится фолс, и нужно выйти из цикла, однако цикл продолжается, программа виснет, а шаговик крутится.

Как сделать правильно, не подскажете?

Вот код в C# (для контроллера всё сделано правильно 100% , поэтому выкладывать нет смысла)

void Button1MouseDown(object sender, MouseEventArgs e) //кнопка нажата
		{
			flag = true;
			while(flag)
			{
				Port_Write(1); //посылаем 1 байт на контроллер
			}
		}
		
		void Button1MouseUp(object sender, MouseEventArgs e) // кнопка отпущена
		{
			flag = false;
		}
  • Вопрос задан
  • 2047 просмотров
Подписаться 2 Средний Комментировать
Решения вопроса 1
Вы входитет в цикл в UI потоке и намертво его утилизируете этим же циклом. Если вы присмотритесь повнимательней, то заметите что кнопка на UI вовсе не отжимается после того как вы ее отпустили. Нужно вынести цикл в отдельный поток, например так:
void Button1MouseDown(object sender, MouseEventArgs e) //кнопка нажата
{
 Task.Run(() => {
      flag = true;
      while(flag)
      {
        Port_Write(1); //посылаем 1 байт на контроллер
      }
});
}


P.S. Я не в курсе микроконтролерной кухни, но может не стоит слать команды с такой частотой?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@NonameProgrammer
А вы то забыли указать доп.условие - как выйти из цикла? Как приложение догадается о том , что кнопка уже не нажата, если вечный цикл?, вот и зависает.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы