Вход | Регистрация


1С:Предприятие ::

Метки: 

Внешняя компонента GFLAx жрет память 4 Гб и вылетает

Я
   Garfild
 
12.04.17 - 09:14
Есть необходимость переворачивать делать различные операции с картинками в 1с, объединять друг с другом, поворачивать. Реализовал это с помощью GFLAx, но выяснил, что при долгой работе 1с отжирает до 4 гигов памяти и вылетает.
Начал проверять в чем проблема, оказалось, что GFLAx, по сути, не освобождает память после использования. Например вот такой кусок кода:

КартинкаGFLAx = Новый COMОбъект("GFLAx.GFLAx");
КартинкаGFLAx.LoadBitmap(ПутьККартинке);
КартинкаGFLAx.Rotate(90);
КартинкаGFLAx.SaveBitmap(ПутьККартинке);
КартинкаGFLAx = Неопределено;

Вроде все элементарно, загружается картинка, поворачивается на 90 градусов, и сохраняется.
Но после каждой такой операции, если смотреть через диспетчер задач, 1с занимает все больше и больше оперативки. Если картинки большие, то за такую операцию запросто может прибавиться до 100 МБ.
Собственно вопрос: кто-нибудь сталкивался с такой или похожей проблемой у GFLAx? Может как-то решили?
Может есть еще варианты объединять/поворачивать картинки, но уже без GFLAx?
 
  Рекламное место пустует
   Лефмихалыч
 
1 - 12.04.17 - 09:16
вот по этому я и не люблю ВК
   Злопчинский
 
2 - 12.04.17 - 09:22
Можно попробовать автору написать. я как-то переписывался с ним по одному вопросу, ответил...
   Лефмихалыч
 
3 - 12.04.17 - 09:23
А еще не люблю тех, кто мануал не читает.
http://www.xnview.com/wiki/index.php/Allocation#gflMemoryFree
   Garfild
 
4 - 12.04.17 - 09:33
(3) перечитал документацию GflAx-Help.chm, которая шла в комплекте, нет там этих команд.
Попробую сейчас добавить 
КартинкаGFLAx.gflMemoryFree();
перед последней строкой
   terraByteG
 
5 - 12.04.17 - 09:51
(0) А память кто высвобождать будет? Или как уборщик должен понять, что пора ее зачищать?
   AneJIbcuH
 
6 - 12.04.17 - 10:08
(4) Помогло?
   Garfild
 
7 - 12.04.17 - 10:10
(6) пока нет, пишет 
"Метод объекта не обнаружен (gflMemoryFree)"
копаюсь дальше
   Кирпич
 
8 - 12.04.17 - 10:22
может не надо каждый раз делать 
Новый COMОбъект("GFLAx.GFLAx"); и КартинкаGFLAx = Неопределено; ?
   Garfild
 
9 - 12.04.17 - 10:27
(8) не помогло, так же оперативка отъедается
   Garfild
 
10 - 12.04.17 - 10:28
смотрю в сторону ImageMagick уже, может там получится
 
  Рекламное место пустует
   Кирпич
 
11 - 12.04.17 - 10:31
(10) ну там то точно получится
   igork1966
 
12 - 12.04.17 - 10:33
http://newsgroup.xnview.com/viewtopic.php?f=4&t=634

the old one mentionned above but some functions are not documented :
FreeBitmap ( set to Nothing isn't enough to free memory ?)
   Кирпич
 
13 - 12.04.17 - 10:35
У себя проверил. Всё работает нормально. Никакой памяти не жрет.
   Кирпич
 
14 - 12.04.17 - 10:37
+(13) 1С:Предприятие 8.3 (8.3.9.1648)
качал отсюда http://www.xnview.com/fr/GFL/
   Вафель
 
15 - 12.04.17 - 10:38
может проще какой ехе шник найти?
   Кирпич
 
16 - 12.04.17 - 10:45
(15) да работает там всё. чота автор там напрограммировал. уж такие элементарные вещи как память освободить xnview думаю не забыли сделать.
   Вафель
 
17 - 12.04.17 - 10:46
(16) на ком как всегда забили, или эту часть индус писал
   Кирпич
 
18 - 12.04.17 - 10:51
(17) да всё работает. только что проверял.
&НаКлиенте
Процедура Команда3(Команда)
    ПутьККартинке = "c:\temp\jpg\IMG_1607.JPG";
    ПутьККартинке2 = "c:\temp\jpg\IMG_1607(2).JPG";    
    Для а = 1 по 100 цикл
        КартинкаGFLAx = Новый COMОбъект("GFLAx.GFLAx");
        КартинкаGFLAx.LoadBitmap(ПутьККартинке);
        КартинкаGFLAx.Rotate(90);
        КартинкаGFLAx.SaveBitmap(ПутьККартинке2);
        КартинкаGFLAx = Неопределено;
    КонецЦикла;
КонецПроцедуры
   Вафель
 
19 - 12.04.17 - 11:01
(18) а на сервере?
   Кирпич
 
20 - 12.04.17 - 11:02
(19) там не знаю, но GFLAx тут точно не при чем.
   Кирпич
 
21 - 12.04.17 - 11:04
так что если и индусы, то только в 1С
   Garfild
 
22 - 12.04.17 - 11:24
(21) походу да, индусы в 1с. Я ж еще после команды 
КартинкаGFLAx = Неопределено;
добавлял процедурку, которая обновляет на форме обработки поле картинки (ну чтобы пользователь видел что он там наворочал).
Когда эту процедуру отключил, память перестала увеличиваться.
Получается, зря я на GFLAx думал.

Осталось это отображение как-то допилить:

ВыбранноеФото = Новый Картинка(ПутьКФайлуКартинки,Ложь);
ЭлементыФормы.Предпросмотр.Картинка = ВыбранноеФото;
ВыбранноеФото = Неопределено;
   Garfild
 
23 - 12.04.17 - 11:26
(22) пока что сделаю, чтобы картинка в предпросмотр была маленькой, а не 2000 на 3000 пикселей. Если память и будет отъедаться, то хотя бы не так сильно
   Garfild
 
24 - 12.04.17 - 11:39
ВремПутьККартинке = ПолучитьИмяВременногоФайла(Прав(ПутьКФайлуКартинки,3));
КартинкаGFLAx = Новый COMОбъект("GFLAx.GFLAx");
КартинкаGFLAx.LoadBitmap(ПутьКФайлуКартинки);
ШиринаКартинки = КартинкаGFLAx.Width;
ВысотаКартинки = КартинкаGFLAx.Height;
Если ШиринаКартинки>ВысотаКартинки Тогда
    НужнаяШирина = Макс(ШиринаКартинки/10,297);
    НужнаяВысота = Макс(ВысотаКартинки/10,210);
Иначе
    НужнаяВысота = Макс(ВысотаКартинки/10,297);
    НужнаяШирина = Макс(ШиринаКартинки/10,210);
КонецЕсли;
КартинкаGFLAx.Resize(НужнаяШирина,НужнаяВысота);
КартинкаGFLAx.SaveBitmap(ВремПутьККартинке);

ВыбранноеФото = Новый Картинка(ВремПутьККартинке,Ложь);
ЭлементыФормы.Предпросмотр.Картинка = ВыбранноеФото;

Уменьшил картинку для предпросмотра по сути в 100 раз. Теперь память увеличивается крайне неохотно. Это не совсем корректное решение, потому что все равно занимаемая память мееедленно, но растет.



Список тем форума
  Рекламное место пустует
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует