2015-08-27 39 views
0

我已经启动Timer来等待某个条件为真。如果条件是真的,那么我停止定时器,并且不希望超时信号发出或执行连接的插槽。但是如果在指定的时间内条件是错误的,那么它就会发出信号timeout()。但无论如何,它总是会发出超时信号。我也使用了blockSignals(true),它不起作用。有人可以请教我。避免QTimer发出超时信号

void timerStart(QTimer* timer, int timeMillisecond) 
{ 
    timer = new QTimer(this); 
    timer->setInterval(timeMillisecond); 
    timer->setSingleShot(true); 
    connect(timer, SIGNAL(timeout()), this, SLOT(noRespFrmServer())) ; 
    //timer->start(timeMillisecond); 
    timer->start(); 
} 
void timerStop(QTimer* timer) 
{ 
    connect(timer, SIGNAL(destroyed(timer)), this, SLOT(stopTimerbeforeTimeout())); 
    qDebug() << " we are in timer stop"; 
    if(timer) 
    { 
     timer->stop(); 
     timer->blockSignals(true); 
     delete timer; 
    } 
} 

也在timerStop函数我试图发出摧毁的信号,但我得到了它无法连接的响应。 请教我。

+0

几件事情看起来嫌疑人 - 中'timerStart()'你忽略传递的参数'timer',并且不存储你新创建的定时器,所以你无法阻止它。你在哪里得到你传递给'timerStop()'的计时器?你可能意味着将'QTimer *&'传递给'timerStart()',或者将该定时器存储在成员或(ugh)全局中? –

回答

2
void timerStart(QTimer* timer, int timeMillisecond) 
{ 
    timer = new QTimer(this); 
    timer->setInterval(timeMillisecond); 
    timer->setSingleShot(true); 
    connect(timer, SIGNAL(timeout()), this, SLOT(noRespFrmServer())) ; 
    //timer->start(timeMillisecond); 
    timer->start(); 
} 

这实际上并没有返回刚创建的计时器。你想要的东西,如:

QTimer *timerStart(int timeMillisecond) 
{ 
    QTimer* timer = new QTimer(this); 
    timer->setInterval(timeMillisecond); 
    timer->setSingleShot(true); 
    connect(timer, SIGNAL(timeout()), this, SLOT(noRespFrmServer())) ; 
    //timer->start(timeMillisecond); 
    timer->start(); 
    return timer; 
} 

然后你就可以通过返回的计时器进入停止功能,虽然我建议你使用deleteLater,而不是直上删除它:

void timerStop(QTimer* timer) 
{ 
    qDebug() << " we are in timer stop"; 
    if(timer) 
    { 
     qDebug() << " we are stopping the timer"; 
     timer->stop(); 
     timer->blockSignals(true); 
     timer->deleteLater(); 
    } 
} 
+0

非常感谢你的伴侣。但它仍然执行超时。我改变了我的代码,但没有喜悦。 – samprat

+0

actualluy在调试我注意到它不执行“我们正在停止计时器”。我只是在调查为什么。 – samprat

+0

确保你实际存储并传递从'timerStart'返回的计时器。 –