Избегайте QTimer для выдачи сигнала тайм-аута

Я запустил таймер, чтобы дождаться выполнения определенного условия. ЕСЛИ условие истинно, тогда я останавливаю таймер и не хочу, чтобы сигнал тайм-аута испускал или выполнял подключенный слот. Но если условие ложно в течение указанного времени, то можно выдать тайм-аут сигнала(). Но в любом случае он всегда выдает сигнал тайм-аута. Я также использовал blockSignals ( true ), и это не работает. Может кто-нибудь, пожалуйста, посоветуйте мне.

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 я пытался выдать уничтоженный сигнал, но получил ответ, что не удается подключиться. Пожалуйста, посоветуйте мне.


person samprat    schedule 27.08.2015    source источник
comment
Несколько вещей выглядят подозрительно: в timerStart() вы игнорируете переданный параметр timer и не сохраняете только что созданный таймер, поэтому у вас нет возможности его остановить. Где вы берете таймер, который вы передаете timerStop()? Возможно, вы имели в виду передать QTimer*& в timerStart() или сохранить таймер в члене или (тьфу) глобально?   -  person Toby Speight    schedule 27.08.2015


Ответы (1)


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();
    }
}
person ratchet freak    schedule 27.08.2015
comment
большое спасибо дружище. но он все еще выполняет тайм-аут. Я изменил свой код, но без радости. - person samprat; 27.08.2015
comment
на самом деле при отладке я заметил, что он не выполняется, мы останавливаем таймер. Я просто выясняю, почему. - person samprat; 27.08.2015
comment
Убедитесь, что вы действительно сохраняете и передаете таймер, возвращенный timerStart. - person ratchet freak; 27.08.2015
comment
Спасибо приятель, я сделал что-то глупое. Это работает нормально. большое спасибо. - person samprat; 27.08.2015