crossplatform.ru

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


  Ответ в ошибка при завершении программы использующей таймер
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 1.5.2010, 11:58
 
Цитата(igor_bogomolov @ 1.5.2010, 3:17) *
А ведь я тебя вижу порой и в 2 ночи, а у тебя это уже 5 утра. Такое впечатление что ты вообще не отдыхаешь
т.к. я в основном работаю дома, то бывает, что досиживаю допоздна, потом сплю до обеда. Но так плохо, полдня потеряно.
igor_bogomolov Дата 30.4.2010, 23:17
  [offtop]
Цитата
2:41 НСК, можно теперь и спать с чистой совестью.
Три часа разница у нас с тобой. А ведь я тебя вижу порой и в 2 ночи, а у тебя это уже 5 утра. Такое впечатление что ты вообще не отдыхаешь
[/offtop]
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, 15:24
  Скорее всего не в таймере дело. Я таким же образом использую таймер QObject'a, и никаких проблем не наблюдаю, ни под Linux ни под Windows. Проверял на всех версиях начиная с 4.5.0
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
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 17:30