AniGif - утечка ресурсов!!!

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Jupiter
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 17.01.2006 (Вт) 12:34

AniGif - утечка ресурсов!!!

Сообщение Jupiter » 12.11.2007 (Пн) 19:15

Здравствуйте. Я использую контрол AniGif.ocx для анимации GIF-файлов. Этот контров многие знают и уважают. Но почему-то нигде не принято говорить, что у него утечки ресурсов. Моя программа стала падать (там многократно создаются маленькие анимированные значки). Я заподозрил утечку. Поставил контроль ресурсов
GuiResTrace6.exe (знаете такую штуку?) Оказалось, что этот AniGif.ocx действительно создает утечку GDI-ресурсов при каждом использовании (создании-удалении) ровно в одну единицу (кисть? перо? контекст? - не важно). Эта учечка проявляется даже на самом примитивном примере - две формы, одна вызывает другую, а на той контрол. Когда у Вас одна картинка на главной форме, то никто не заметит такой мизерной утечки, а если это в цикле, то использование данного контрола вообще невозможно. Другие аналогичные контролы не обладают нужными мне качествами.
Вопросы
1. Как можно из моей программы на VB6 заткнуть эту утечку? (Боюсь, что это из области фантастики)
2. Какой OCX проигрывает gif, без утечек, имеет ПРОЗРАЧНЫЙ фон, и и имеет событие при каждой смене кадра?
3. Можно ли сделать прозрачный фон у gif-контрола, не имеющего такого свойства официально?
4. С помощью какого алгоритма я могу самостоятельно воспроизводить gif-файл на основе штатного Image-контрола из VB6?
Спасибо.
Вложения
Скриншот утечки.JPG
Скриншот утечки.JPG (60.34 Кб) Просмотров: 397

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.11.2007 (Пн) 19:27

2. Мой из здешних Проектов.
4. Он с исходниками всех своих "алгоритмов".
Изображение

Jupiter
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 17.01.2006 (Вт) 12:34

Сообщение Jupiter » 12.11.2007 (Пн) 19:30

tyomitch писал(а):2. Мой из здешних Проектов.
4. Он с исходниками всех своих "алгоритмов".
Спасибо за скорый ответ. Это очень интересно. Где можно ознакомится с данным проектом?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.11.2007 (Пн) 19:56

Изображение

Jupiter
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 17.01.2006 (Вт) 12:34

Сообщение Jupiter » 13.11.2007 (Вт) 12:42

Tyomitch, помоги, пожалуйтса, разобраться. Изначально в контроле уже присутствует картинка кошки. И она анимирована. Я далаю закружку своего gif-файла командой
Код: Выделить всё
GifCtl(0).LoadFile "c:\XXX\yyy.gif"
Но при этом нет анимации.

Вопросы:
1. Как запустить анимацию после загрузки файла?
2. Как удалить изображение кошки из exe-файла (сделать пустой контрол)?

Очень нужны вещи:
3. методы для запуска и останова анимации
4. свойство, возвращающее номер текущего кадра (без него событие FrameChanged выглядит сиротливо).
5. Метод для принудительного перехода на нужный кадр.

Поясню. У меня на изображении значок. При анимации от него расходятся волны в разные стороны. На первом кадре значок изображен без волн - это неподвижная версия значка При проигрывании я должен ПРОПУСКАТЬ первый кадр, т.к. в нем не волн, он не является фазой движения. Значит я должен написать:
Код: Выделить всё
Private Sub GifCtl_FrameChanged(Index As Integer)
    if GifCtl(Index).IsPlaing then
          if GifCtl(Index).CurrFrame=0 then GifCtl(Index).CurrFrame = 1
   end if
End Sub
(IsPlaing и CurrFrame я придумал сам)
Думаю, что имея искходики я смог бы сам добавить что мне нужно, но мне нужна наводка от самого автора.

Спасибо.

Jupiter
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 17.01.2006 (Вт) 12:34

Сообщение Jupiter » 13.11.2007 (Вт) 14:28

Все! Разобрался со всем, чуть-чуть подправил. Все работает! Tyomitch, ты гений! Это ж надо, такую штуку слепить. Главное удобство, что я могу сам добавлять нужные свойства и события (в пределах разумного)
Сейсас вот еще проверю на утечки ресурсов и как будет вести себя при большом количестве значков на форме. Сообщу.
СПАСИБО

Jupiter
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 17.01.2006 (Вт) 12:34

Сообщение Jupiter » 14.11.2007 (Ср) 14:56

Tyomitch, подскажи, пожалуйста.
Открываю твой оригинальный проект. На странице свойств для твоего контрола GifCtl на форме присутствуют все свойства, какие есть. Начинаю писать код.
Код: Выделить всё
Private Sub XXX()
    Dim P As GifCtl
    p.   ' Здесь после точки список свойств маленький
End Sub

Спсиок свойств оказывается значительно скуднее. Там нет в частности свойств Visible и ToolTipText. И если вручную написать после точки .Visible, то компилятор ругается: нет такого свойства. Прилагаю двойной рисунок, поясняющий мысль. Помоги доступиться к Visible и ToolTipText.
Прикол в том, что если я пишу
Код: Выделить всё
Private Sub XXX()
    GifCtl(0).   
End Sub
т.е. обращаюсь непосредственно, без ссылки, то все свойства на месте.


И еще. Иногда (в режиме дизайна) контрол на форме становится заштрихованный. При этом из окна свойств пропадают некторые свойства. Что это означает?
Вложения
Спросить у Tyomitch'a.JPG
Спросить у Tyomitch'a.JPG (48.25 Кб) Просмотров: 389

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.11.2007 (Ср) 17:11

1) Эти свойства находятся в классе VBControlExtender. Прикастуй свою ссылку к этому типу.

2) Что нужно закрыть окно с его дизайнером.
Изображение

Jupiter
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 17.01.2006 (Вт) 12:34

Сообщение Jupiter » 14.11.2007 (Ср) 18:05

tyomitch писал(а):Прикастуй свою ссылку к этому типу
Что это значит? Я первый раз встречаю слово "Прикастуй". Умоляю, под угрозой идея анимации значков в нашем проекте.

Кстати, вот еще ссылка на аналогичный проект. Есть исходники проекта ocx:
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?lngWId=1&txtCodeId=8224

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 14.11.2007 (Ср) 20:15

Jupiter
Прикастуй (to cast), значит приведи к типу.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.11.2007 (Ср) 23:36

Jupiter писал(а):
tyomitch писал(а):Прикастуй свою ссылку к этому типу
Что это значит? Я первый раз встречаю слово "Прикастуй". Умоляю, под угрозой идея анимации значков в нашем проекте.

Код: Выделить всё
Private Sub XXX()
    Dim P As GifCtl
    ' Засовываешь что-нибудь в P
    Dim E As VBControlExtender
    Set E = P ' Каст тут
    E.Visible = (Rnd > .5) ' ;-)
End Sub
Изображение

Jupiter
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 17.01.2006 (Вт) 12:34

Сообщение Jupiter » 15.11.2007 (Чт) 0:15

Код: Выделить всё
Private Sub XXX()
    Dim P As GifCtl
    ' Засовываешь что-нибудь в P
    Dim E As VBControlExtender
    Set E = P ' Каст тут
    E.Visible = (Rnd > .5) ' ;-)
End Sub
А, ну вот теперь понятно. Завтра с утра сразу и попробую. спасибо.

Jupiter
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 17.01.2006 (Вт) 12:34

Сообщение Jupiter » 15.11.2007 (Чт) 17:36

Dim P As GifCtl
Set P = GifCtl(0)
Dim E As VBControlExtender
Set E = P ' RUN TIME ERROR: Type mismatch

Оказальсь, надо наоборот:

Dim E As VBControlExtender
Set E = GifCtl(0)
Dim P As GifCtl
Set P = E ' :-)

И потом рулить обоими указателями. Для одних свойств брат E, для других P Первый раз такое вижу. Но, вроде на первом этапе работает.

Jupiter
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 17.01.2006 (Вт) 12:34

Сообщение Jupiter » 16.11.2007 (Пт) 18:23

tyomitch, у тебя есть такая строка:
Код: Выделить всё
m_Enabled = m_AutoStart ' Or m_Enabled
Советую раскомертировать. Немало намучился с одним глюком, пока не нашел.

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

И еще. Полная загрузка всех кадров у тебя сделана по мере проигрывания в первый раз всего цикла. Это специально так? Для убыстрения? Один недостаток такого метода: сразу после загрузки значка до начала воспроизведения я должен узнать, подлежит ли значок анимации (т.е. больше одндого кадра в нем или нет). Этого я сделать не могу, т.к. контрол пока что не знает, сколько у него кадров. Загружен одит - первый.

Отсутствие утечек ресурсов в данном контроле подтверждаю.

Как видишь, твоему контролу предстоит работать в непростых условиях. Большие требования к функциональности (прозначн. фон, события, признак анимируемости, первый кадр пропускать при воспроизведении, сполшная заливка). Будут много мелких (29x29) значков на плане. С ними происходят разные чудеса.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.11.2007 (Пт) 21:15

Jupiter писал(а):И еще. Полная загрузка всех кадров у тебя сделана по мере проигрывания в первый раз всего цикла. Это специально так? Для убыстрения?

Да. Тестил на видеоролике 640x480, сохранённом в 10-метровый GIF. Полная загрузка перед первым кадром занимала с десяток секунд; а с постепенной загрузкой -- укладывалось в положенное между кадрами время.


По остальным вопросам смогу ответить завтра с утра, сейчас уже почти сплю.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.11.2007 (Сб) 8:57

Jupiter писал(а):И еще. Пожалуйста, скажи, как проще всего реализовать функуцю очистки (Clear)? В ряде случаев я должен убирать изображение значка и заливать его сплошным цветом.

Код: Выделить всё
Public Sub Clear()
UserControl.Cls
End Sub


Jupiter писал(а):И еще. Полная загрузка всех кадров у тебя сделана по мере проигрывания в первый раз всего цикла. Это специально так? Для убыстрения? Один недостаток такого метода: сразу после загрузки значка до начала воспроизведения я должен узнать, подлежит ли значок анимации (т.е. больше одндого кадра в нем или нет). Этого я сделать не могу, т.к. контрол пока что не знает, сколько у него кадров. Загружен одит - первый.

Для ручной прокрутки кадров, с выключенным таймером:
Код: Выделить всё
Public Sub AdvanceFrame()
Dim l_Enabled As Boolean
l_Enabled = tmrFrame.Enabled
tmrFrame_Timer
tmrFrame.Enabled = l_Enabled
End Sub
Изображение

Jupiter
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 17.01.2006 (Вт) 12:34

Сообщение Jupiter » 19.11.2007 (Пн) 15:12

Все-таки сильно напрягает отсутствие нормальной поддержки ссылок. Раздвоение личности, при котором надо работать одновременно со ссылками типа GifCtl и VBControlExtender. У меня очень гублко передаются эти ссылки. Вот сижу как умный и переписываю все функции. Нельзя это как-то переделать, чтобы по нормальному было (по ссылке GifCtl доступны ВСЕ имеющиеся свойства)?

Jupiter
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 17.01.2006 (Вт) 12:34

Сообщение Jupiter » 19.11.2007 (Пн) 16:09

Все. Присобачил. Все работает, спасибо, tyomitch!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 62

    TopList