Timeout срабатывает после остановки QTimer

175
09 апреля 2018, 01:04

В основном классе MainWidnow определён Qtimer* timer. Внутри одного из методов класса timeout связывается с публичным слотом:

if (!timer)
{
    timer = new QTimer(this);
}
connect(timer, SIGNAL(timeout()), this, SLOT(redraw()));
timer->start(2000);

Где redraw():

void MainWindow::redraw()
{   
    QMessageBox msg;
    msg.setText("Called");
    msg.exec();
    if( !stack.isEmpty() )
    {
        stack[0]->mark ^=  stack[0]->mark || 1;
        stack[0]->edge->update();
        stack.removeFirst();
    }
    else
    {
        timer->stop();
        delete timer;
    }
}

Где stack - это QList. Если проверить дебаггером, то в условие остановки таймера и его удаления, функция входит вовремя, но при этом единожды срабатывает после остановки. В чём может быть причина? Если после этого снова запустить таймер, то функция вызывается дважды с интервалом меньше секунды, и после остановки вызывается дважды.

P.S.: что слот, что таймер вызываются лишь в одном методе на весь проект, а слот исключительно по таймауту.

Answer 1
  1. Удаление объектов Qt следует выполнять при помощи deleteLater
  2. Нет гарантии, что при удалении таймера в очереди событий не останутся события, которые радостно прибегут на следующем раунде обработки.

Решение - вызвать disconnect, когда в таймере отпадет необходимость.

READ ALSO
Поместить значения парсинга в mongodb

Поместить значения парсинга в mongodb

При помещении информации, которую извлекаю с сайтов столкнулся с проблемой

198
RMI. Ошибка при запуске сервера

RMI. Ошибка при запуске сервера

При запуске сервера через пакетный файл, в открывшейся консоли выскакивает вот такая ошибка, может быть кто нибудь знает как это пофиксить?...

217
Ошибка No description и No repository field

Ошибка No description и No repository field

После установки чего либо npm install вылазит этоКак исправить?

161