Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Недостаточно памяти 
V
    Опции темы
TGrey
Дата 23.1.2010, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: 1
Всего: 1



Здравсвуйте, нужен совет по след. вопросу. Есть приложение в нем разрабатываем GUI. В качестве объектов выступают обычные графические элементы: Линии, Круги, 4угольники.
Далее при нужном событии мыши вызываются те или иные функции для расчета координат.
Ошибка в линии. Сперва они рисуется целой, далее после чего 2кликом по ней в том месте создается узел из него линия продолжается(излом так сказать).
На данный момент борюся с проблемой, что линия иногда начинает передвигаться не так, как должна.
Так вот именно после таких перемещение, после нескольких повторений, все объекты на форме красятся в белый цвет.
Цвет выделения красный, во время выделения по бокам линии создаются кружки(для перемещения), так вот во время этого глюка во время того, как линия выделена то видно только белые кружки. Тобишь ни один цветной объект не отрисовывается. Если попробовать нажать кнопку PrtScr вылазит сообщение, "Недостаточно памяти закройте одно или несколько приложений". Помогает только перезапуск.
Дело в том, что во время этого никаких динамических объектов не создается поэтому чем забита память не знаю, в Диспетчере приложение берет столько же памяти сколько и при его открытии.
Поскольку проблемы с отрисовкой, думаю, возможно проблемы с контекстом? Или что оно может быть.
PM MAIL   Вверх
VictorTsaregorodtsev
Дата 23.1.2010, 21:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 28.7.2006

Репутация: 1
Всего: 8



Скорее всего, какие-то гуевые объекты (и/или их хэндлы) не удаляются во время работы программы. Помониторьте диспетчером задач счетчик общего числа дескрипторов в системе (на вкладке "быстродействие") во время операций с прогой (даже без добавления новых граф.объектов - просто при простой регулярной перерисовке экрана, т.е. отклике на ОнПайнт). Тем более, что Вы пишите, что динамических объектов и не создается - чисто в рамках гуевых вызовов (вернее, в рамках последующей неуборки за собой после рисования) проблема находится.

PM MAIL WWW   Вверх
TGrey
Дата 23.1.2010, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: 1
Всего: 1



Число вот сейчас написано 8700, при включении программы повышается на 50. И не растет. То есть с ними вроде все норм. Я смотрю Фаерфокс сильно грузит систему, сейчас выключу его попробую без него.
PM MAIL   Вверх
TGrey
Дата 23.1.2010, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: 1
Всего: 1



Вот прикрепляю программу. Выключил фаерфокс, тупит меньше, но эффект остался тот же.
В программе нажмите на кнопку Проводник на проводнике двойным кликом добавьте изломов, штук 5.
Потом возьмите за 1 из этих точек и хаотично подергайте по форме. У меня через секунд 10-20 пропадает все цветные выделения и видны только кружки.

На счет динамического создания, оно выполняется только тогда, когда создаются изломы(для продолжения линии). Потом же при перемещении выполняются только функции изменения координат этой линии. Возможно столь быстрое выполнение этой операции вызывает этот эффект?
Функция новых координат
Код

void IConductor::MoveSide2(HWND hwnd, int x, int y)
{
    End.x = x;
    End.y = y;
    if( NextCond != NULL )
    {
        NextCond->Start.x = x;
        NextCond->Start.y = y;
    }
    InvalidateRect(hwnd, NULL, true);
}

Кстати я вот попробовал, закоментил InvalidateRect(hwnd, NULL, true); после чего, линия перерисовывается только после доп. клика на форме, но сколько я не тягал, оно не заглючивало.
Что ж это ему вредно, многократное перерисовывание окна?

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  TOE.exe 216,09 Kb
PM MAIL   Вверх
GremlinProg
Дата 24.1.2010, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



после запуска программы, открой диспетчер задач, найди в нем свой процесс, добавь столбец "Объекты GDI"
теперь, перемещай отрезок и наблюдай за числом GDI объектов, оно растет, т.е. на лицо утечка GDI ресурсов

как ее решать, на верное знаешь: удалять объекты после использования

Добавлено через 1 минуту и 36 секунд
не заметил пост VictorTsaregorodtsev )


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
TGrey
Дата 24.1.2010, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: 1
Всего: 1



Вопс! Спасибо! До этого я смотрел на вкладке быстродействие, там было все нормально. А насчет того, что можно выбрать поля, никогда не пользовался. Теперь буду знать большое спасибо! smile 
Код

void IConductor::Draw(HDC *dc)
{
    HBRUSH lettuceBrush = CreateSolidBrush(RGB(0, 150, 0));
    MoveToEx(*dc, GetSX(), GetSY(), NULL);
    if( !selected )
        SelectPen(*dc, CP);
    else
        SelectPen(*dc, SCP);

    LineTo(*dc, GetEX(), GetEY());
    if( selected )
    {
        SelectBrush(*dc, lettuceBrush);
        SelectPen(*dc, CP);
        Ellipse(*dc, GetSX()-4, GetSY()-4, GetSX()+4, GetSY()+4);
        Ellipse(*dc, GetEX()-4, GetEY()-4, GetEX()+4, GetEY()+4);
    }
    if( NextCond != NULL )
        NextCond->Draw(dc);
    DeleteObject(lettuceBrush);
}

Кстати вот как интересно получилось, что все проблемы создавала только 1 не удаляемая кисть.
А если так хаотично дергать и особенно если объектов больше нужно отрисовывать, то я не удивлен.
Теперь все хорошо) Спасибо.
PM MAIL   Вверх
artsb
Дата 24.1.2010, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 5
Всего: 64



А SelectBrush и SelectPen самопальные функции. Проверьте и другие места. Может ещё где-то забыли "прибраться".


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
TGrey
Дата 24.1.2010, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: 1
Всего: 1



Не сейчас все норм. GDI держатся на 1 уровне и увеличиваются только при создании нового объекта. А выбор кисти и карандаша производится из класса. Поэтому Их я буду удалять в деструкторе уже.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0622 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.