Вытеснение / прерывание QT -слота

#c #qt5

#c #qt5

Вопрос:

Я пытаюсь написать приложение для тестирования платы ST через последовательный порт, и в настоящее время я сталкиваюсь со следующей проблемой. (Приведенный ниже код — это просто упрощение проблемы.)

 Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , m_button(new QPushButton(this))
    , m_timer(new QTimer(this))
{
    m_timer->setSingleShot(true);
    connect(m_button, amp;QPushButton::released, this, amp;Widget::RunTest);
    connect(m_timer, amp;QTimer::timeout, this, amp;Widget::OnTimeout);
}

void Widget::RunTest()
{
    qDebug() << "Start test";

    m_timer->start(1000);
    while (m_timeout != true);

    qDebug() << "Start end";
}

void Widget::OnTimeout()
{
    qDebug() << "Timeout";
    m_timeout = true;
}
  

Я хочу иметь отдельный класс для сбора и запуска тестов. Тесты запускаются нажатием кнопки. Некоторые тесты должны будут отправлять данные через последовательный порт и ждать ответа. Я хотел бы иметь возможность реализовать функцию тайм-аута (если плата не отвечает, завершите тест с ошибкой). Однако приложение ожидает флаг m_timeout на неопределенный срок. Итак, мой вопрос: существует ли какой-либо механизм сигнала / слота, аналогичный вытеснению прерывания? Если нет, то как решаются проблемы sush в Qt? Должен ли я создать отдельный объект QTimer и запустить его в отдельном потоке?

Комментарии:

1. Избавьтесь от while (m_timeout != true); остальных, все выглядит нормально.

2. Чтобы добавить к комментарию @drescherjm, в целом старайтесь избегать использования while как можно больше. Если вам нужно чего-то ждать, используйте сигналы и слоты. В противном случае, не ждите, пока что-то произойдет. Вместо этого реагируйте на события.

3. @drescherjm 😉 Это было больше, чем просто голосование. Спасибо за добрые слова!

4. Но дело в том, что после этого цикла while я хочу выполнить некоторые проверки полученного кадра.

5. Используйте сигналы и слоты вместо цикла: связанные https://doc.qt.io/qt-5/qserialport.html#signals и его базовый класс https://doc.qt.io/qt-5/qiodevice.html#signals