Благодаря подсказке @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()
, таймер был остановлен. Тогда я почувствовал, что это не должно быть так глупо. У меня все еще есть сомнения, но моя проблема решена. Я обновлю более подробную информацию, когда у меня будет время. Спасибо всем откликнувшимся мне.
person
Tairan Liu
schedule
07.05.2018
delete teleTimer()
наdelete teleTimer->deleteLater();
- person eyllanesc   schedule 06.05.2018teleTimer->deleteLater();
? Я пробовал, но все равно вылетает. Я думаю, что проблема исходит отteleTimer->stop()
, а неdelete
. - person Tairan Liu   schedule 06.05.2018somefunction1()
,somefunction2()
,somefunction3()
, ... . Я не вводил. Я использую таймер с разными интервалами. Но ваш комментарий имеет смысл. Это не обязательно. Отличный совет. - person Tairan Liu   schedule 07.05.2018