Автор: Litkevich Yuriy 30.4.2010, 13:14
Никак не могу понять, как же правильно работать со встроенным в QObject таймером.
В данный момент работа, схематично, выглядит так:
class MyClass : public QObject
{
Q_OBJECT
public:
MyClass(QObject *parent):QObject(parent){}
~MyClass(){}
void method();
protected:
void timerEvent(QTimerEvent *event);
private:
int timerId;
}
void MyClass::method()
{
timerId = startTimer(400);
}
void MyClass::timerEvent(QTimerEvent *event)
{
if (timerId != event->timerId())
return;
killTimer(timerId);
// что-то ещё делаем
}
есть несколько объектов разных классов, которые создаются по цепочке, один в другом. В каждом может быть таймер и он используется по одной и той же схеме.
При завершении программы виндовоз показывает сообщение об ошибке ("Память не может быть read")
Такая ситуация наблюдается у всех моих программ, которые используют таймер встроенный в QObject. И в разных версиях Qt, начиная с Qt 4.3.5
Автор: igor_bogomolov 30.4.2010, 15:24
Скорее всего не в таймере дело. Я таким же образом использую таймер QObject'a, и никаких проблем не наблюдаю, ни под Linux ни под Windows. Проверял на всех версиях начиная с 4.5.0
Автор: Litkevich Yuriy 30.4.2010, 22:41
факт, проблема была не в таймере.
был такой код:
#include "spcontroller.h"
...
Говоря языком связистским, мне нужно было "поставить шлейф". Т.е. вместо штатного класса использовать заглушку, чтобы проверить часть программы без всяких коммуникаций с внешним миром.
Я решил, что удобнее будет иметь переключалку в pro-файле.
Создал каталог
imitators и положил в него модифицированные файлы
spcontroller.{h|cpp}, а в pro-файле сделал так:
CONFIG += imitator
...
contains(CONFIG, imitator){
SOURCES += imitators/spcontroller.cpp
HEADERS += imitators/spcontroller.h
}else{
SOURCES += spcontroller.cpp
HEADERS += spcontroller.h
}
весь проект очистил, и собрал. Красота всё работает.
Пока тестил, поменял немного интерфейс в
spcontroller.hВсё опять очень хорошо, вот только при завершении работы стала возникать авария. Авария прекращалась когда я комментировал всю работу с таймерами. Это меня отвлекло. Пришлось собирать проект по шагам, добавляя файл за файлом и проверяя как работает.Сначала я убедился, что таймеры действительно не причём.
Ну а когда дошла очередь до
spcontroller (Собирал сразу версию с заглушкой, без штатных файлов. ) тут-то я и увидел проблему. Т.к. компиллер на отрез отказался компилировать проект.
Причина:
#include "spcontroller.h" - говорит компиллеру искать файл в каталоге данного файла.
тогда я сделал так:
#include <spcontroller.h> - говорит компиллеру искать файл в каталоге указанном с помощью ключа
-I.
Но и так компилироваться не будет, т.к. каталог
imitators не находится в списке включаемых. И того нужно было ещё в pro-файл вписать:
INCLUDEPATH += imitators
Разумеется если я добавлю штатные файлы в каталог с основными исходниками, опять начнутся проблемы. Т.к. каталог с основными исходниками уже есть в списке включаемых файлов.
Принципиально проблемы-то начались именно из-за того, что я поменял интерфейс. Но очень "удачно"
П.С.
Вот такая вот у меня история сегодня случилась.
П.ПС.
2:41 НСК, можно теперь и спать с чистой совестью.
Автор: igor_bogomolov 30.4.2010, 23:17
[offtop]
Цитата
2:41 НСК, можно теперь и спать с чистой совестью.
Три часа разница у нас с тобой. А ведь я тебя вижу порой и в 2 ночи, а у тебя это уже 5 утра. Такое впечатление что ты вообще не отдыхаешь
[/offtop]
Автор: Litkevich Yuriy 1.5.2010, 11:58
Цитата(igor_bogomolov @ 1.5.2010, 3:17)
А ведь я тебя вижу порой и в 2 ночи, а у тебя это уже 5 утра. Такое впечатление что ты вообще не отдыхаешь
т.к. я в основном работаю дома, то бывает, что досиживаю допоздна, потом сплю до обеда. Но так плохо, полдня потеряно.