#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