Имя: Пароль:
1C
1С v8
Внешняя компонента GFLAx жрет память 4 Гб и вылетает
0 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
4 Garfild
 
12.04.17
09:33
(3) перечитал документацию GflAx-Help.chm, которая шла в комплекте, нет там этих команд.
Попробую сейчас добавить
КартинкаGFLAx.gflMemoryFree();
перед последней строкой
5 terraByteG
 
12.04.17
09:51
(0) А память кто высвобождать будет? Или как уборщик должен понять, что пора ее зачищать?
6 AneJIbcuH
 
12.04.17
10:08
(4) Помогло?
7 Garfild
 
12.04.17
10:10
(6) пока нет, пишет
"Метод объекта не обнаружен (gflMemoryFree)"
копаюсь дальше
8 Кирпич
 
12.04.17
10:22
может не надо каждый раз делать
Новый COMОбъект("GFLAx.GFLAx"); и КартинкаGFLAx = Неопределено; ?
9 Garfild
 
12.04.17
10:27
(8) не помогло, так же оперативка отъедается
10 Garfild
 
12.04.17
10:28
смотрю в сторону ImageMagick уже, может там получится
11 Кирпич
 
12.04.17
10:31
(10) ну там то точно получится
12 igork1966
 
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С
22 Garfild
 
12.04.17
11:24
(21) походу да, индусы в 1с. Я ж еще после команды
КартинкаGFLAx = Неопределено;
добавлял процедурку, которая обновляет на форме обработки поле картинки (ну чтобы пользователь видел что он там наворочал).
Когда эту процедуру отключил, память перестала увеличиваться.
Получается, зря я на GFLAx думал.

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

ВыбранноеФото = Новый Картинка(ПутьКФайлуКартинки,Ложь);
ЭлементыФормы.Предпросмотр.Картинка = ВыбранноеФото;
ВыбранноеФото = Неопределено;
23 Garfild
 
12.04.17
11:26
(22) пока что сделаю, чтобы картинка в предпросмотр была маленькой, а не 2000 на 3000 пикселей. Если память и будет отъедаться, то хотя бы не так сильно
24 Garfild
 
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 раз. Теперь память увеличивается крайне неохотно. Это не совсем корректное решение, потому что все равно занимаемая память мееедленно, но растет.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.