С подсказкой @eyllanesc моя проблема наконец решена.
В самом начале я использовал delete teleTimer
, затем моя программа начала падать. В то время я думал, что причина в том, что таймер на самом деле не останавливался к тому времени, когда эта функция снова вызывалась. Затем я изменил свой код, чтобы запустить еще один таймер одиночного выстрела, чтобы у него действительно был таймер для остановки.
Самое начало: (разбился)
void timerSwitch()
{
if (teleTimer->isActive())
{
qDebug() << teleTimer->remainingTime();
teleTimer->stop();
delete teleTimer;
}
if (mode == 1)
{
teleTimer = new QTimer();
QObject::connect(teleTimer, SIGNAL(timeout()), this, SLOT(somefunction()));
teleTimer->start(200);
}
else if (mode == 2)
{
somefunction2();
}
}
Первое изменение: (разбился)
void timerSwitch()
{
if (teleTimer->isActive())
{
qDebug() << teleTimer->remainingTime();
teleTimer->stop();
delete teleTimer;
}
if (mode == 1)
{
teleTimer = new QTimer();
QObject::connect(teleTimer, SIGNAL(timeout()), this, SLOT(somefunction()));
teleTimer->start(200);
}
else if (mode == 2)
{
teleTimer = new QTimer();
teleTimer.singleshot(..., ..., SLOT(somefunction2()));
}
}
Затем с подсказкой @eyllanesc я изменил свой код на:
void timerSwitch()
{
if (teleTimer->isActive())
{
qDebug() << teleTimer->remainingTime();
teleTimer->stop();
teleTimer->deleteLater();
}
if (mode == 1)
{
teleTimer = new QTimer();
QObject::connect(teleTimer, SIGNAL(timeout()), this, SLOT(somefunction()));
teleTimer->start(200);
}
else if (mode == 2)
{
teleTimer = new QTimer();
teleTimer.singleshot(..., ..., SLOT(somefunction2()));
}
}
Моя программа все еще не работала.
Затем я изменил свой код на:
void timerSwitch()
{
if (teleTimer->isActive())
{
qDebug() << teleTimer->remainingTime();
teleTimer->stop();
teleTimer->deleteLater();
}
if (mode == 1)
{
teleTimer = new QTimer();
QObject::connect(teleTimer, SIGNAL(timeout()), this, SLOT(somefunction()));
teleTimer->start(200);
}
else if (mode == 2)
{
somefunction2();
}
}
На этот раз моя программа работает нормально. Я тестировал более 20 раз, все работало правильно и не вылетало.
При этом все причины, приведенные моим компьютером, аналогичны следующим:
Thread 2 Crashed:: QThread
0 org.qt-project.QtCore 0x000000010ed4be3b QObject::killTimer(int) + 27
1 org.qt-project.QtCore 0x000000010ed5a9b9 QTimer::stop() + 25
2 com.yourcompany.QTGCS 0x000000010dffa609 TelemetrySerialWorker::setTelemetryMode(int) + 745 (telemetryserialworker.cpp:114)
Я думал, что ошибка возникла из stop()
, поскольку isActive()
возвращает true
, но remainingTime()
возвращает -1
. Насколько я понял, когда вызывался isActive()
, таймер действительно как-то не останавливался, но когда вызывался remainingTime()
, таймер останавливался. Тогда я почувствовал, что это не должно быть так глупо. У меня все еще есть сомнения, но моя проблема решена. Я обновлю более подробную информацию, когда у меня будет время. Спасибо, все ребята ответили мне.