2015-08-16 5 views
2

У меня есть устройство, которое движется по линейному пути, в основном linear actuator. Когда устройство достигает физических целей, он достигает предельного контакта, который посылает сигнал на мое программное обеспечение. Мне нужно будет постоянно проверять, включен ли этот сигнал. Но у меня возникают трудности с реализацией этой логики в Qt5.5.Непрерывный контроль в основном цикле в Qt 5.5

Я читал на QtConcurrent, и это похоже на жизнеспособное решение, но после его внедрения на тестовом диске я узнал, что не могу решить свою проблему без какого-либо цикла while(true). Однако реализация цикла while(true), похоже, замедляет все остальное на моем коде, поэтому это решение совершенно бесполезно.

Я бы опубликовал код, но при условии, что он использует библиотеки и номенклатуру устройств, которые имеют очень специфическую нишу, я пощажу вам боль, но если кто-нибудь может направить меня к чтению на что-то подобное, я был бы очень благодарен. Я предпочел бы избегать QtThread и в основном вручную настраивать потоки, так как я не чувствую себя комфортно, работая с ними на этом этапе, и у меня есть ограничение по времени на этот проект, поэтому было бы лучше, если бы я не экспериментировал.

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

ответ

1
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() занимает много времени, то это помогает, если этот класс перемещается из основного потока.

+0

Ответ вы не только полностью решили мою проблему, но я теперь изучил совершенно новую парадигму в Qt. Большое спасибо. (кажется, мне нужно 15 человек, чтобы проголосовать) – bromega

Смежные вопросы