2017-11-18 15 views
-1

타이밍 구현에 문제가 있습니다. 내가하고 싶은 일은 다음을 실행하는 것입니다 :C++ 타이머 문제

//relay 1 power cycle 
void MainWindow::relay1PCycle() 
{ 
    relay1High(); 
    while (true){ 
     QTimer::singleShot(750, this, SLOT(relay1Low())); 
     QTimer::singleShot(750, this, SLOT(relay1High())); 
    } 
} 

버튼을 누르고있는 동안.

//power cycle button 
void MainWindow::on_pushButton_3_toggled(bool checked) 
{ 
    if (checked){ 
     //run relay1PCycle as a thread. 
    } 
    else{ 
     //Terminate relay1PCycle thread. 
    } 
} 

그러나 지금까지 시도한 모든 것이 실패했습니다.

이 문제를 해결하는 올바른 방법은 무엇입니까?

감사

+0

코드 작성시 스레드가 생성되지 않습니다. 'std :: thread','std :: async' 또는'QThread'를 대신 사용해보십시오. – nwp

+1

슬롯 생성이 차단되어 있지 않으므로 while 코드가 여러 타이머를 만듭니다. – eyllanesc

+0

@nwp 나는 std :: thread를 이렇게 시도했다 : std :: thread t1 (relay1PCycle); 그리고 난 "정적이 아닌 멤버 함수의 잘못된 사용"오류가 발생 Qthread 나는 전혀 얻을 수 없습니다. – Aesgarth

답변

0

가 차단하지 구현하려는 작업, 그래서 스레드, 적절한 논리 만 타이머를 사용할 필요가 없습니다.

mainwindow.h : 그런 개체가 생성 누르면 슬롯에 사용되는

relaycontroller.h

#ifndef RELAYCONTROLLER_H 
#define RELAYCONTROLLER_H 

#include <QObject> 
#include <QTimer> 

#include <QDebug> 

class RelayController : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit RelayController(QObject *parent = 0):QObject(parent){ 
     timer = new QTimer(this); 
     state = false; 
     timer->setInterval(750); 
     //old style 
     connect(timer, SIGNAL(timeout()), this, SLOT(onTimeout())); 
     //new style 
     //connect(timer, &QTimer::timeout, this, &RelayController::onTimeout); 
    } 
    void start(){ 
     qDebug()<<"timer"; 
     timer->start(); 
    } 
    void stop(){ 
     timer->stop(); 
    } 

    void relayLow(){ 
     //code here: relay off 
     qDebug()<<"low"; 
    } 
    void relayHigh(){ 
     //code here: relay on 
     qDebug()<<"high"; 
    } 

private slots: 

    void onTimeout(){ 
     if(state) 
      relayHigh(); 
     else 
      relayLow(); 
     state = !state; 
    } 
private: 
    QTimer *timer; 
    bool state; 
}; 

#endif // RELAYCONTROLLER_H 

: 간단 우리가 다음 클래스에 해당 작업을 할당 할 수 있도록하려면

private: 
    RelayController *controller; 

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    controller = new RelayController(this); 
    ui->pushButton_3->setCheckable(true); 
} 

void MainWindow::on_pushButton_toggled(bool checked) 
{ 
    if(checked) 
     controller->start(); 
    else 
     controller->stop(); 
} 
+0

고마워요,하지만 그것은 매우 복잡해 보입니다 ... 그리고 내게 여러 가지 오류가 발생했습니다 : relaycontroller.h : 17 : 오류 : 'void QTimer :: timeout()'이 보호됩니다 이 컨텍스트 내에서 connect (타이머 , & QTimer :: timeout, this, & RelayController :: onTimeout); ^ ~~~~~~ 나에게 그것을 보는 또 다른 방법을 제공합니다. 좀 더 자세히 살펴볼 것이지만, 파이 자체를 코딩 할 때 모든 것이 오래 걸립니다. – Aesgarth

+0

@Aesgarth 제 코드를 수정했습니다. 이전 버전의 Qt가 있기 때문에 발생했다고 생각됩니다. 이전 버전과 호환되도록 수정했습니다. 원할 경우 팀 뷰어를 통해 도움을받을 수 있습니다. – eyllanesc

+0

Qt Creator 4.2.0을 사용하고 있습니다. 내 무지를 용서하지만 팀 뷰어는 어떻게 작동합니까? (QT 5.7을 기반으로 추가 편집.1) – Aesgarth