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