![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Здравсвуйте, нужен совет по след. вопросу. Есть приложение в нем разрабатываем GUI. В качестве объектов выступают обычные графические элементы: Линии, Круги, 4угольники.
Далее при нужном событии мыши вызываются те или иные функции для расчета координат. Ошибка в линии. Сперва они рисуется целой, далее после чего 2кликом по ней в том месте создается узел из него линия продолжается(излом так сказать). На данный момент борюся с проблемой, что линия иногда начинает передвигаться не так, как должна. Так вот именно после таких перемещение, после нескольких повторений, все объекты на форме красятся в белый цвет. Цвет выделения красный, во время выделения по бокам линии создаются кружки(для перемещения), так вот во время этого глюка во время того, как линия выделена то видно только белые кружки. Тобишь ни один цветной объект не отрисовывается. Если попробовать нажать кнопку PrtScr вылазит сообщение, "Недостаточно памяти закройте одно или несколько приложений". Помогает только перезапуск. Дело в том, что во время этого никаких динамических объектов не создается поэтому чем забита память не знаю, в Диспетчере приложение берет столько же памяти сколько и при его открытии. Поскольку проблемы с отрисовкой, думаю, возможно проблемы с контекстом? Или что оно может быть. |
|||
|
||||
| VictorTsaregorodtsev |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 28.7.2006 Репутация: 1 Всего: 8 |
Скорее всего, какие-то гуевые объекты (и/или их хэндлы) не удаляются во время работы программы. Помониторьте диспетчером задач счетчик общего числа дескрипторов в системе (на вкладке "быстродействие") во время операций с прогой (даже без добавления новых граф.объектов - просто при простой регулярной перерисовке экрана, т.е. отклике на ОнПайнт). Тем более, что Вы пишите, что динамических объектов и не создается - чисто в рамках гуевых вызовов (вернее, в рамках последующей неуборки за собой после рисования) проблема находится.
|
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Число вот сейчас написано 8700, при включении программы повышается на 50. И не растет. То есть с ними вроде все норм. Я смотрю Фаерфокс сильно грузит систему, сейчас выключу его попробую без него.
|
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Вот прикрепляю программу. Выключил фаерфокс, тупит меньше, но эффект остался тот же.
В программе нажмите на кнопку Проводник на проводнике двойным кликом добавьте изломов, штук 5. Потом возьмите за 1 из этих точек и хаотично подергайте по форме. У меня через секунд 10-20 пропадает все цветные выделения и видны только кружки. На счет динамического создания, оно выполняется только тогда, когда создаются изломы(для продолжения линии). Потом же при перемещении выполняются только функции изменения координат этой линии. Возможно столь быстрое выполнение этой операции вызывает этот эффект? Функция новых координат
Кстати я вот попробовал, закоментил InvalidateRect(hwnd, NULL, true); после чего, линия перерисовывается только после доп. клика на форме, но сколько я не тягал, оно не заглючивало. Что ж это ему вредно, многократное перерисовывание окна? Присоединённый файл ( Кол-во скачиваний: 9 )
TOE.exe 216,09 Kb |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
после запуска программы, открой диспетчер задач, найди в нем свой процесс, добавь столбец "Объекты GDI"
теперь, перемещай отрезок и наблюдай за числом GDI объектов, оно растет, т.е. на лицо утечка GDI ресурсов как ее решать, на верное знаешь: удалять объекты после использования Добавлено через 1 минуту и 36 секунд не заметил пост VictorTsaregorodtsev ) -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Вопс! Спасибо! До этого я смотрел на вкладке быстродействие, там было все нормально. А насчет того, что можно выбрать поля, никогда не пользовался. Теперь буду знать большое спасибо!
Кстати вот как интересно получилось, что все проблемы создавала только 1 не удаляемая кисть. А если так хаотично дергать и особенно если объектов больше нужно отрисовывать, то я не удивлен. Теперь все хорошо) Спасибо. |
|||
|
||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 5 Всего: 64 |
А SelectBrush и SelectPen самопальные функции. Проверьте и другие места. Может ещё где-то забыли "прибраться".
-------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Не сейчас все норм. GDI держатся на 1 уровне и увеличиваются только при создании нового объекта. А выбор кисти и карандаша производится из класса. Поэтому Их я буду удалять в деструкторе уже.
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |