Как реализовать: пока нажата кнопка — выполнять команду? Доброго времени суток.
Суть : шаговый двигатель подключен к микрухе 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;
}

21 Авг 2019 в 06:22
212 +1
0
Ответы
1

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

Примерно так это можно реализовать:

using System;
using System.Threading;
using System.Windows.Forms;
namespace StepMotorControl
{
public partial class MainForm : Form
{
private bool flag;
public MainForm()
{
InitializeComponent();
}
private void Button1MouseDown(object sender, MouseEventArgs e)
{
flag = true;
Thread thread = new Thread(() =>
{
while (flag)
{
Port_Write(1); //посылаем 1 байт на контроллер
}
});
thread.Start();
}
private void Button1MouseUp(object sender, MouseEventArgs e)
{
flag = false;
}
private void Port_Write(byte data)
{
// Ваш код отправки данных на контроллер
}
}
}

В этом примере мы создаем новый поток выполнения для цикла отправки данных на контроллер, чтобы основной поток (GUI поток) не был заблокирован. При отпускании кнопки флаг устанавливается в false, что приводит к завершению цикла в фоновом потоке.

Надеюсь, это поможет вам решить проблему. Если у вас есть дополнительные вопросы, не стесняйтесь задавать.

20 Апр в 13:19
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 83 795 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир