2015-08-27 1 views
0

Я начал Таймер ждать, пока определенное условие будет истинным. Условие IF истинно, тогда я останавливаю таймер и не хочу, чтобы сигнал тайм-аута выдавал или выполнял подключенный слот. Но если условие является ложным в течение указанного времени, тогда он полностью испускает таймаут сигнала(). Но в любом случае он всегда излучает сигнал таймаута. Я также использовал 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 я попытался испустить уничтоженный сигнал, но получил ответ, что он не может подключиться. pLease совет мне.

+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

спасибо alot мат. но он все равно выполняет тайм-аут. Я изменил свой код, но без радости. – samprat

+0

actalluy при отладке Я заметил, что он не выполняет «мы останавливаем таймер». Я просто расследую, почему. – samprat

+0

Убедитесь, что вы действительно храните и передаете таймер, который был возвращен с 'timerStart'. –