Совместное использование последовательного порта между периодическими фоновыми задачами и действиями по нажатию пользоваC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Совместное использование последовательного порта между периодическими фоновыми задачами и действиями по нажатию пользова

Сообщение Anonymous »

Я пишу простой графический интерфейс Winforms на C# для управления некоторым лабораторным оборудованием. В моем графическом интерфейсе есть несколько кнопок и меток, которые используются для отображения информации, полученной посредством последовательного опроса, а также позволяют пользователю отправлять команды оборудованию. Как команды оборудованию, так и ответы на них различаются по размеру в зависимости от состояния машины и от того, какая команда отправляется или на нее отвечает. На данный момент он работает через обратный вызов Windows.Forms.Timer и реализует то, что я считаю примитивным устранением конфликтов устройств в основном потоке, но это приводит к задержке графического интерфейса (я предполагаю, что он не отвечает при выполнении обновления). Большинство пользователей этого графического интерфейса с этим согласятся, но в прошлом у меня были коллеги, которые начинали щелкать мышью, как будто они участвуют в турнире по Starcraft, когда графический интерфейс проявлял хоть малейший сбой. Он выполняет свою работу, но мне хотелось бы научиться делать это лучше. Я провел около недели, читая материалы здесь, на MSDN, GFG и т. д., и я вижу много вещей, которые кажутся актуальными, но они немного ускользают от меня, и у меня возникают проблемы с их объединением, и я надеюсь вы, ребята/девчонки, можете помочь.
Сейчас я устраняю конфликты моего последовательного порта, используя пару логических значений. Моя разработка происходит на неподключенной машине, но вот соответствующая структура для того, что я делаю.

Код: Выделить всё

class MyCoolGadget
{
private bool updateInProgress;
private bool commandInProgress;
private System.Windows.Forms.Timer updateTimer = new System.Windows.Forms.Timer();

public MyCoolGadget()
{
updateTimer.Interval = 1000;
updateTimer.Tick += new EventHandler(updateCallback);
updateInProgress = false;
commandInProgress = false;
// Other constructor stuff
}

private void updateCallback(object sender, EventArgs e)
{
Update();
}

// This method is called by other class methods as well as by GUI element callbacks
public byte[] sendCommand(byte id, byte[] payload)
{
string caller = new System.Diagnostics.StackFrame(1).GetMethod().Name;

// Loop here checks to see if there is an update is in progress and it needs to wait
// for the serial port. If Update is the caller, we ignore the wait or we get stuck
// in an infinite loop. This is part of what i want to clean up.
while (updateInProgress && (caller != "Update"))
{
Thread.Sleep(25);
}

if (caller != "Update")
{
commandInProgress = true;
}

// Build message, send it, get answer

if (caller != "Update")
{
commandInProgress = false;
}

return answer;
}

// This method is called every second by the timer's callback
private void Update()
{
byte[] replyBuffer;

while (commandInProgress)
{
Thread.Sleep(10);
}

updateInProgress = true;

replyBuffer = sendCommand(id1, payload1);
// Update properties based on reply. GUI elements bound to class properties so they update
// without further action on my part.

replyBuffer = sendCommand(id2, payload2);
// Update properties based on reply.

replyBuffer = sendCommand(id3, payload3);
// Update properties based on reply.

updateInProgress = false;
}
}
Итак, это работает, но неуклюже, вызывает задержку графического интерфейса, и я уверен, что это не лучший способ справиться с этим. Я видел несколько статей и ответов, в которых, по-видимому, есть элементы моей проблемы, но когда я пытаюсь адаптировать эти решения, я либо полностью нарушаю свой код, либо получаю поведение, которого я не ожидаю и не понимаю.
Моя конечная цель состоит в том, чтобы метод Update вызывался в фоновом потоке, чтобы графический интерфейс не зависал, и когда действие пользователя запрашивает отправку сообщения (в большинстве случаев нажатие кнопки), это сообщение не происходит. t перекрывать обновление. Я почти уверен, что асинхронные методы и await вступят в игру, но когда я пытаюсь их использовать, я получаю ошибки и не нашел примеров, которые я мог бы понять. Я также изучил делегаты, но примеры, которые я вижу, просто выглядят как использование метода для вызова метода, и я не вижу, как это перемещает что-либо на задний план. Примеры с пояснениями, адаптированными для аппаратного специалиста, приветствуются.
Заранее спасибо!

Подробнее здесь: https://stackoverflow.com/questions/785 ... -click-act
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Сельдерей победил, не справляясь с периодическими задачами
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Проблемы с фоновыми задачами AWS Lambda FastAPI [дубликат]
    Anonymous » » в форуме Python
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Проблема с фоновыми задачами в iOS 17.2 после обновления за январь 2025 г.
    Anonymous » » в форуме IOS
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Проблема с фоновыми задачами в iOS 17.2 после обновления за январь 2025 г.
    Anonymous » » в форуме IOS
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Как запускать задачи зависимости одновременно с задачами независимости и задачами внутри цикла for?
    Anonymous » » в форуме Python
    0 Ответы
    33 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»