«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как исправить неполный поиск данных с помощью государственных машин (команды и ответы)

Как исправить неполный поиск данных с помощью государственных машин (команды и ответы)

Опубликовано в 2025-03-12
Просматривать:530

How Can a State Machine Solve the Problem of Incomplete Data Retrieval When Sending a Sequence of Commands and Waiting for Responses?

Отправка последовательности команд и ожидает ответа

в вашем сценарии, поток отвечает на метод блокировки чтения/записи, ожидая, пока он обнаружит ключевое слово или время, используя waitforkeword (). К сожалению, когда Readlines () используется для тестирования приложения, получается только небольшая часть файла. Кроме того, READLINES немедленно возвращает FALSE во время второй итерации, не ожидая тайм -аута.

Понимание проблемы

. Проблема проистекает из дизайна readlines (), которая считывает все доступные данные и отделяет их на строки. Когда обрабатывается последовательность команд, Readlines () читает только первую часть файла, потому что она не обнаруживает ключевое слово. Впоследствии, когда он снова вызван, READLINES () возвращает false, поскольку он уже итерация по всем доступным данным.

достигая надежного подхода

для эффективной отправки последовательности команд и ожидания их ответов, рассмотрите возможность использования подхода машинного машины. Это обеспечивает структурированный и надежный метод управления потоком команд и ответов, гарантируя, что ожидаемый ответ получен перед продолжением. Q_object Apppipe m_port {nullptr, qiodevice :: readwrite, это}; Состояние s_boot {& m_mach, "s_boot"}, s_send {& m_mach, "s_send"}; Finalstate s_ok {& m_mach, "s_ok"}, s_failed {& m_mach, "s_failed"}; публика: Программист (QObject * parent = 0): statefulobject (parent) { ConnectSignals (); m_mach.setinitialstate (& s_boot); Отправить (& s_boot, & m_port, "boot \ n"); Ожидайте (& S_BOOT, & M_PORT, "Boot успешно", & S_SEND, 1000, & S_FAILED); Send (& s_send, & m_port, ": hullothere \ n: 00000001ff \ n"); Ожидайте (& S_SEND, & M_PORT, "Загрузить успешно", & s_ok, 1000, & s_failed); } Apppipe & pipe () {return m_port; } };

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

этого подхода

class Programmer : public StatefulObject {
Q_OBJECT
AppPipe m_port { nullptr, QIODevice::ReadWrite, this };
State      s_boot   { &m_mach, "s_boot" },
s_send   { &m_mach, "s_send" };
FinalState s_ok     { &m_mach, "s_ok" },
s_failed { &m_mach, "s_failed" };
public:
Programmer(QObject * parent = 0) : StatefulObject(parent) {
connectSignals();
m_mach.setInitialState(&s_boot);
send  (&s_boot, &m_port, "boot\n");
expect(&s_boot, &m_port, "boot successful", &s_send, 1000, &s_failed);
send  (&s_send, &m_port, ":HULLOTHERE\n:00000001FF\n");
expect(&s_send, &m_port, "load successful", &s_ok, 1000, &s_failed);
}
AppPipe & pipe() { return m_port; }
};

обработка тайм-аута

: Тайм-ауты могут быть указаны для каждого ожидаемого ответа, гарантируя, что система не висит на неопределенный срок. обработка.

асинхронная природа
    : машина состояния может быть выполнена одновременно с основным применением, устраняя проблемы блокировки.
  • ]
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3