crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> ошибка при завершении программы использующей таймер
Litkevich Yuriy
  опции профиля:
сообщение 30.4.2010, 13:14
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Никак не могу понять, как же правильно работать со встроенным в 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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов (1 - 4)
igor_bogomolov
  опции профиля:
сообщение 30.4.2010, 15:24
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Скорее всего не в таймере дело. Я таким же образом использую таймер QObject'a, и никаких проблем не наблюдаю, ни под Linux ни под Windows. Проверял на всех версиях начиная с 4.5.0
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.4.2010, 22:41
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


факт, проблема была не в таймере.

был такой код:
#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
Сообщение #4


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


[offtop]
Цитата
2:41 НСК, можно теперь и спать с чистой совестью.
Три часа разница у нас с тобой. А ведь я тебя вижу порой и в 2 ночи, а у тебя это уже 5 утра. Такое впечатление что ты вообще не отдыхаешь
[/offtop]
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.5.2010, 11:58
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(igor_bogomolov @ 1.5.2010, 3:17) *
А ведь я тебя вижу порой и в 2 ночи, а у тебя это уже 5 утра. Такое впечатление что ты вообще не отдыхаешь
т.к. я в основном работаю дома, то бывает, что досиживаю допоздна, потом сплю до обеда. Но так плохо, полдня потеряно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.12.2024, 8:40