У меня есть устройство, которое движется по линейному пути, в основном линейный привод. Когда устройство достигает физического конца, оно достигает предельного контакта, который посылает сигнал моему программному обеспечению. Мне нужно будет постоянно проверять, есть ли этот сигнал в сети. Но у меня возникают трудности с реализацией этой логики в Qt5.5.
Я читал на QtConcurrent
и кажется, что это жизнеспособное решение, но после его внедрения на тест-драйв я обнаружил, что не могу решить свою проблему без какого-либо while(true)
петля. Однако реализация while(true)
цикл, кажется, замедляет все остальное в моем коде, поэтому делает это решение совершенно бесполезным.
Я бы опубликовал код, но, учитывая, что он использует библиотеки и номенклатуру устройств, которые имеют очень специфическую нишу, я избавлю вас от боли, но если кто-нибудь сможет направить меня к чтению чего-то подобного, я был бы очень благодарен. Я бы предпочел держаться подальше от QtThread
и, в основном, ручная настройка потоков, так как я не чувствую себя комфортно, работая с ними в данный момент, и у меня есть ограничение по времени для этого проекта, поэтому было бы лучше, если я не буду много экспериментировать.
tldrМне нужно как-то поместить код в основной цикл программы, которая проверяет изменение логического значения. Указанное изменение отправляется в программу извне устройством, которое обменивается данными через Ethernet.
class Checker : public QObject
{
Q_OBJECT
public:
Checker(void)
{
timer.setInterval(100);// give it a interval, like 100ms?
connect(timer, SIGNAL(timeout()), this, SLOT(checkHW()));
}
void start(void)
{
timer.start();// although you can start the timer in the constructor
// but I guess you want to start it later, after HW is
// ready.
}
private Q_SLOTS:
void checkHW()
{
bool hit = false;
// check the hardware here
if(hit){
emit hitEnd();// tell others about the event
}
}
signals:
void hitEnd(void);
private:
QTimer timer;
}
Если проверка аппаратного переключателя не занимает много времени, тогда вам не нужен другой поток. Однако если checkHW()
действительно занимает много времени, а затем помогает, если этот класс перемещен из основного потока.