crossplatform.ru

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


  Ответ в Падает программа (сигналы и слоты)
Введите ваше имя
Подтвердите код

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

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


Последние 10 сообщений [ в обратном порядке ]
Iron Bug Дата 18.1.2012, 22:52
 
Цитата(medhaid @ 18.1.2012, 23:42) *
P.S. насчёт оптимизации, я просто разбираюсь... как бы такой задачи нет...

это всегда надо иметь в виду. когда программист не думает о том, какие ресурсы сожрёт его софтина, потом получаются всякие нехорошие вещи :) из решения мелких задач складывается опыт программирования. чем больше опыта - тем быстрее и лучше программист справляется с задачами.
medhaid Дата 18.1.2012, 20:42
  ага, переполнение стека) ток вчера въехал почему.....
я думал что сигнал запомниться в очередь а потом по выходу из деструктора выполниться... как бы не какой рекурсии...

как вычитал в boost signal вызов прямой сразу...
а вот в signal2 вызов через очереди.. и с ними мой пример(в теории, пока не проверил) отработал бы нормально..

Спасибо, за подсказку.



P.S. насчёт оптимизации, я просто разбираюсь... как бы такой задачи нет...
Алексей1153 Дата 18.1.2012, 7:36
  можно организовать в классЕ статический массив-дерево. Тогда обход дерева можно будет в цикле делать, а не загружать стек рекурсией
Iron Bug Дата 17.1.2012, 23:37
  chkstk.asm - проблемы со стеком. он тупо переполняется.
увеличивай стек. но это нехорошая тенденция - увеличивать стек, если количество переменных и глубина цепочки вызовов может меняться. лучше подумать об оптимизации.
medhaid Дата 17.1.2012, 22:33
  Здравствуйте,
В этот раз сам разобраться не смог....

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

#include <boost/signal.hpp>
#include <boost/bind.hpp>
#include <iostream>

int count = 0;

//===============================класс в котором возникает событие==========
class ObJEcT//: public boost::signals::trackable
{
public:
    ObJEcT()
    {
        count++;
    }

    ObJEcT(ObJEcT *obj)
    {
        count++;
        this->connectOnDestroy(boost::bind(&ObJEcT::destroy, obj));
    }

    ~ObJEcT()
    {
        count--;
        std::cout << "~ " << count<< std::endl;
        onDestroy(); //при удаление сообшяем всем кто слушает
    }

    void destroy()
    {
        delete this;
    }

    //возрашяет ссылку на сигнал.. для отмены если чё..
    void connectOnDestroy(boost::function<void()> slot)
    {
        onDestroy.connect(slot);
    }

private:
    boost::signal<void (void)> onDestroy;
};


int main()
{
    
    ObJEcT *tmp = new ObJEcT();
    for (int i = 0; i < 232; i++) // 232 отрабатывает нормально если выше то програма вылетает
    {
        tmp = new ObJEcT(tmp);
    }
    delete tmp;

    system("pause");

    return 0;
}


при количестве объектов меньше 233 всё работает нормально, если свыше то программа вылетает ссылаясь на какой-то асемблеровский файл chkstk.asm

с чем это связано???)
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 23.2.2020, 12:40