Russian Qt Forum
Май 04, 2024, 03:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 183 184 [185] 186 187 188
2761  Qt / Общие вопросы / Re: Как создать объект с уникальным для него идентификатором? : Январь 20, 2009, 13:55
Цитировать
Хотя конечно если нужно хранение идентификаторов, то такой способ не подходит
да! именно эти ID-ы должны храниться в БД...

Цитировать
что значит "неэкономия"? после удаления объектов уже ж не будет, а какая разница с какого числа будет айди начинаться?

а если объектов не 2000 а 200000! и например в процессе "конфигурирования" приложения - придется удалять/добавлять новые объекты... при этом счетчик будет делать ++ ... но счетчик - не резиновый!

и например после определенного кол-ва добавлений/удалений объектов - счетчик просто переполнится ! так что это решение - на крайняк , если ничего лучше не придумается Улыбающийся
2762  Qt / Общие вопросы / Re: Как создать объект с уникальным для него идентификатором? : Январь 20, 2009, 13:41
а если я хочу и удалять объекты к примеру... то не напасешься разрядностью этого счетчика

например
1. создал 2000 объектов, Cnt=1-2000,
2. удалил из них 1000
3. создал еще 1000 -> Cnt=2001-3000 !!! (т.е не используются те значения ID которые были в удаленных мною объектах)

 т.е получается нифига не экономия!

ЗЫ: я раньше так делал... но это не то
2763  Qt / Общие вопросы / Re: QList . Как узнать, правильно ли удаляются указатели? : Январь 20, 2009, 13:27
2 Winstrol ,

спасибо, буду пробовать! Улыбающийся
2764  Qt / Общие вопросы / Как создать объект с уникальным для него идентификатором? : Январь 20, 2009, 13:24
Доброго времени всем !

Тут столкнулся с такой задачкой:

1. например при создании какого нибудь класса (оператором new) необходимо как-то его идентифицировать, т.е отличать его от других таких же классов...
2. количество создаваемых таким образом классов ограничено допустим числом в 2000 штук
3. каждый такой класс "внутри" имеет некую ЦЕЛУЮ (int) переменную id ...

идея в том, чтобы из множества созданных однотипных классов отыскать класс с нужным идентификатором - и потом с ним работать!

так вот:
1. каким образом при создании класса генерировать эту переменную ID так, чтобы однозначно она определяла этот класс (т.е не повторялась и т.п.) ?
2.  может есть какие-то стандартные методы в QT?

2765  Qt / Общие вопросы / Re: QList . Как узнать, правильно ли удаляются указатели? : Январь 20, 2009, 12:41
2 Winstrol ,

а где взять :
Цитировать
Надо пользоваться каким либо small object allocator / pool и.т.п.
Непонимающий

это спец. библиотека нужна с этими функциями?
2766  Qt / Общие вопросы / Re: QList . Как узнать, правильно ли удаляются указатели? : Январь 20, 2009, 11:23
2 spirit

я сделал как посоветовали:
1. в консоли мильон раз (i<1000000) отобразилось сообщение:  TestClass::dtor called
2. пока оно выводилось - память потребляемая увеличивалась + приложение подвисло
3. после того как выводится сообщения перестали - память стабилизировалась + приложение отвисло
2767  Qt / Общие вопросы / Re: QList . Как узнать, правильно ли удаляются указатели? : Январь 20, 2009, 11:11
Цитировать
У меня в несколько модифицированном тесте объем потребляемой памяти стабилизировался после первой итерации, ищите дальше.

у меня если жмакаю "создать 10000 объектов" а потом жмакаю "очистить лист" - то тоже вроде устаканивается (хотя по 1-10 байт набирает потихоньку все-равно)

а вот если жмакаю несколько раз "создать 10000 объектов" - а потом "очистить лист" - то память накапливается!
2768  Qt / Общие вопросы / Re: QList . Как узнать, правильно ли удаляются указатели? : Январь 20, 2009, 11:03
Цитировать
а dtor'ы TestClass и всех ваших классов вызываются и отрабатываются верно(поставте бряку или qDebug, что бы убедиться)?

если можно, то поподробнее пжлста ! где что ставить? (я ж новичек ! Улыбающийся )

вот реализация TestClass к примеру:

*.h
Код:
#ifndef MYCLASS_H
#define MYCLASS_H

class TestClass
{
public:
TestClass();
int getValue();
void setValue(int value);
private:
int testvalue;
};

#endif // MYCLASS_H

*.cpp
Код:
#include "myclass.h"

TestClass::TestClass()
{
testvalue = 0;
}

int TestClass::getValue()
{
return testvalue;
}

void TestClass::setValue(int value)
{
testvalue = value;
}
2769  Qt / Общие вопросы / Re: QList . Как узнать, правильно ли удаляются указатели? : Январь 20, 2009, 10:41
Цитировать
2 kuzulis, для чистоты проверь в несколько итераций, если возвращается к одному и тому же значению, то скорее всего утечки нет.
не... потребление памяти растет ... я сделал i<1000000 .... и после удаления и последующего создания - память не высвобождается польностью, а накапливается... вот накопил до 60 Мб Улыбающийся

но ведь после delete нужно обнулить указатель... а как это в QList можно сделать? ведь после удаления из QList - уже доступ никак к указателю через QList не получить (т.к он уже удален из QList)  В замешательстве
2770  Программирование / С/C++ / Re: Как создать класс с "меняющейся начинкой" ? : Январь 20, 2009, 10:25
Цитировать
я для модбаса классы не городил, неудобно, все эти хахаряхи лучше в БД держать.

идея такая:

1. в БД будет храниться конфигурация модуля, т.е каналов - контроллеров - регистров...
2. при инициализации модуля - он читает свою конфу из БД и в соответствии с ней создает в памяти соосветствующие структуры данных... (чтобы постоянно не считывать конфу из БД и не "шуршать" винтом - а держать в оперативе)
3. тек значения опрошенных регистров пишет в БД только при их изменении (стобы не шуршать "винтом") и т.п
2771  Программирование / С/C++ / Re: Как создать класс с "меняющейся начинкой" ? : Январь 20, 2009, 10:17
Цитировать
Тут имелось в виду, что непонятно зачем тебе вообще понадобились такие классы?
Зачем нужны эти классы Registr? Что с их помощью ты делаешь?
Эмулятор процессора? Калькулятор? Интерпретатор своего мегаскрипта?

Улыбающийся см. http://ru.wikipedia.org/wiki/Modbus

я просто имею "творческий" порыв сделать хоть чо-то полезное в жизни! Улыбающийся а именно - эти все мои вопросы связаны с началом реализации мной некоего "велосипеда" SCADA системы Улыбающийся

кроме класса "регистр" - планирую сделать класс "контроллер" и потом класс "канал"...

т.е в канале имеются контроллеры  - а в контроллерах регистры!

структура такая:

модуль ---> канал1 ---> контроллер1 ---> регистры 4х
            |                   |--> контроллер2 ---> регистры 4х
            |                                                |--> регистры 3х
            |--> канал2 ---> контроллер1 ---> регистры 4х
...........................................................................................
...........................................................................................
...........................................................................................

и т.п.
 
это все реализация "модуля" Modbus !!!

1. регистры имеют разные типы: 0x,1x,3x,4x
2. контроллеры в принципе - один класс (тип)
3. каналы - тоже разные классы  (типы) : ModbusRTUMaster, ModbusRTUSlave,ModbusTCPMaster, ModbusTCPSlave

Улыбающийся

Цитировать
Если это не учебное задание, то вполне можно под подобные задачи найти какое-нибудь удобное решение а не кодировать всё с 0 не зная языка. Улыбающийся

да! кое чего не знаю! Улыбающийся но кодировать придется с 0 !
2772  Qt / Общие вопросы / QList . Как узнать, правильно ли удаляются указатели? : Январь 20, 2009, 10:02


Доброго времени суток!

как проверить код на утечки памяти?

например я написал код в котором создаются некие объекты, указатели на которые я помещаю в QList

Код:
void Dialog::slNew()
{
    for (int i = 0; i<100000; ++i) {
        TestClass *tc = new TestClass; //создаю мои объекты
        tc->setValue(++cnt); //это просто для проверки объекта потом
        clist.append(tc); //в лист указатели на объекты вношу
    }
}


и очищаю лист как приведено в ассистенте:

Код:
void Dialog::slDel()
{
while (!clist.isEmpty())
delete clist.takeFirst();
}

пробовал смотреть в винде через диспетчер задач...
при запуске приложения выделяется к примеру 3 Мб.. жму - создать объекты - становиться к примеру 18 Мб...
жму очистить лист - становится 7Мб ...

т.е получается, что память все больше и больше "кушается" Непонимающий т.е есть утечка?
2773  Программирование / С/C++ / Re: Как создать класс с "меняющейся начинкой" ? : Январь 19, 2009, 14:36
Цитировать
В этом случае можно заменить value_ на QVariant. Но нужно понимать что это оверхед. Если в качестве значения не будут использоваться классы (а только bool, int, qint16 и т.п.) - вместо QVariant лучше использовать union:
дадада! никаких классов в качестве значений не будет!

но непонятно с юнионами... как будут выглядеть тогда ф-ции:
Код:
quint16 getValue(); 
и
Код:
void setValue(quint16 regvalue); 

Непонимающий
2774  Программирование / С/C++ / Re: Как создать класс с "меняющейся начинкой" ? : Январь 19, 2009, 14:26
и если использовать QVariant - то переписать так наверное придется:

Код:
typedef enum TModbusRegisterType { rt0x, rt1x, rt3x, rt4x}


class TModbusRegister
{
public:
    TModbusRegister(TModbusRegisterType regtype);
    TModbusRegisterType getType();                                  //получить тип регистра
    quint16 getAddress();                                           //получить адрес регистра
    QVariant getValue();                                             //получить значение регистра !!!!!!!!!!!!!!!!!!
    void setAddress(quint16 regaddress);                            //установить адрес регистра
    void setValue(QVariant regvalue);                                //установить значение регистра !!!!!!!!!!!
private:
    TModbusRegisterType type_;
    quint16 address_;
    QVariant value_;                                                //!!!!!!!!!
}
2775  Программирование / С/C++ / Re: Как создать класс с "меняющейся начинкой" ? : Январь 19, 2009, 14:18
Цитировать
Но все же классы контейнеров являются не самоцелью, а частью решения. Например что межает заменить класс Registr на QVariant?

т.е имеете ввиду наследовать от QVariant ? или я чо - то не понял Улыбающийся ?

а  вообще-то первоначально класс выглядел так:

Код:
typedef enum TModbusRegisterType { rt0x, rt1x, rt3x, rt4x}


class TModbusRegister
{
public:
    TModbusRegister(TModbusRegisterType regtype);
    TModbusRegisterType getType();                                  //получить тип регистра
    quint16 getAddress();                                           //получить адрес регистра
    quint16 getValue();                                             //получить значение регистра
    void setAddress(quint16 regaddress);                            //установить адрес регистра
    void setValue(quint16 regvalue);                                //установить значение регистра !!!
private:
    TModbusRegisterType type_;
    quint16 address_;
    quint16 value_;
}
Страниц: 1 ... 183 184 [185] 186 187 188

Страница сгенерирована за 0.059 секунд. Запросов: 23.