Как реализовать: пока нажата кнопка — выполнять команду? Доброго времени суток.
Суть : шаговый двигатель подключен к микрухе 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
267 +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 Апр 2024 в 13:19
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир