Объект — плагин для CAN, конструктор/деструктор, open/close — этим всем кути заведует, сама вызывает, когда надо, когда в приложении производятся действия с драйвером CAN'а.
В объекте сделал QTimer, приконнектил к слоту.
В open — стартую, в close — выключаю.
Через раз вылезает исключение — пришло событие таймера моему объекту, только адрес на 24 (0x18) отличается, в большую сторону, если это важно.
Сделал отладочную печать везде где можно, вижу, как срабатывает конструктор, как деструктор, как open/close, вижу, что таймер стопариться.
И всё равно прилетает событие таймера.
Переделал, стал connect/disconnect делать при старте/стопе — та же фигня.
Переделал, убрал отдельный таймер, стал использовать QObject::startTimer/QObject::killTimer — та же фигня.
После стопа таймера добавил QCoreApplication::removePostedEvents( this, (int)QEvent::Timer ) — и опять та же фигня.
Здравствуйте, удусекшл, Вы писали:
У>Чего я не так делаю?
Какую роль таймер выполняет? Просто так крутится?
Если что-то по нему должно срабатывать, то connect нужно делать по QTimer::timeout() В методе, куда сконнекчен timeout, таймер стопается. Собственно, все.
Здравствуйте, XOOIOOX, Вы писали:
XOO>Какую роль таймер выполняет? Просто так крутится?
По таймеру выгребаются данные из устройства
XOO>Если что-то по нему должно срабатывать, то connect нужно делать по QTimer::timeout() В методе, куда сконнекчен timeout, таймер стопается. Собственно, все.
Здравствуйте, удусекшл, Вы писали:
У>По таймеру выгребаются данные из устройства
Он запускается по событию? Или постоянно с интервалом крутится?
Если последнее, то в слоте привязки таймера по таймауту, после обработки, запускай его заново.
Здравствуйте, XOOIOOX, Вы писали:
XOO>Он запускается по событию? Или постоянно с интервалом крутится? XOO>Если последнее, то в слоте привязки таймера по таймауту, после обработки, запускай его заново.
Идея такая, что single shot timer перезапускать ручками в обработчике?
Скрытый текст
class TimerRestarter
{
public:
TimerRestarter( QTimer &t ) : m_timer(t)
{
m_timer.stop();
}
~TimerRestarter()
{
m_timer.setSingleShot(true);
m_timer.setInterval(50); // 20 times per ec
m_timer.setTimerType(Qt::CoarseTimer);
m_timer.start();
}
protected:
QTimer &m_timer;
};
Вставил в обработчик таймера
TimerRestarter timerRestarter(m_pollTimer);
Та же фигня — прилетает событие после разрушения объекта
Здравствуйте, удусекшл, Вы писали:
У>Всем привет!
У>Объект — плагин для CAN, конструктор/деструктор, open/close — этим всем кути заведует, сама вызывает, когда надо, когда в приложении производятся действия с драйвером CAN'а.
У>В объекте сделал QTimer, приконнектил к слоту.
У>В open — стартую, в close — выключаю. У>Через раз вылезает исключение — пришло событие таймера моему объекту, только адрес на 24 (0x18) отличается, в большую сторону, если это важно.
На самом деле, это критическая точка.
Очень похоже на проблемы с таблицей виртуальных функций.
Проверьте список родителей класса CanBackend. (Возможно, наследник QObject-а не первый в списке родителей.)
Адреса this, static_cast<QObject*>(this), dynamic_cast<QObject*>(this) должны совпадать.
Нет ли в определении CanBackend (или родителей), каких-то ifdef которые по разному срабатывают в разных единицах трансляции, или какого-то другого нарушения ODR?
У>Сделал отладочную печать везде где можно, вижу, как срабатывает конструктор, как деструктор, как open/close, вижу, что таймер стопариться.
У>И всё равно прилетает событие таймера. У>Переделал, стал connect/disconnect делать при старте/стопе — та же фигня.
У>Переделал, убрал отдельный таймер, стал использовать QObject::startTimer/QObject::killTimer — та же фигня.
У>После стопа таймера добавил QCoreApplication::removePostedEvents( this, (int)QEvent::Timer ) — и опять та же фигня.
У>Чего я не так делаю?
Проверьте какому потоку принадлежат таймер и CanBackend. Возможно, кто-то, например устанавливая родителя, перекинул объект из потока в поток.
Здравствуйте, XOOIOOX, Вы писали:
У>>Сначала так и было
XOO>Похоже, что где-то создается копия таймера, которая шлет сигнал на слот. XOO>Можно попробовать добавить флаг Qt::UniqueConnection в соединение.
Здравствуйте, Chorkov, Вы писали:
У>>В open — стартую, в close — выключаю. У>>Через раз вылезает исключение — пришло событие таймера моему объекту, только адрес на 24 (0x18) отличается, в большую сторону, если это важно.
C>На самом деле, это критическая точка. C>Очень похоже на проблемы с таблицей виртуальных функций. C>Проверьте список родителей класса CanBackend. (Возможно, наследник QObject-а не первый в списке родителей.)
QObject — единственный родитель. Со смещением я разобрался — у меня есть подобъект, которому я делегирую работу, и куда передаю событие таймера. Там исключение и происходит. Я просто сначала протупил.
C>Адреса this, static_cast<QObject*>(this), dynamic_cast<QObject*>(this) должны совпадать.
Совпадают
C>Проверьте какому потоку принадлежат таймер и CanBackend. Возможно, кто-то, например устанавливая родителя, перекинул объект из потока в поток.
Везде навставлял вывод ID текущего потока — он один