Имя: Пароль:
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 раз. Теперь память увеличивается крайне неохотно. Это не совсем корректное решение, потому что все равно занимаемая память мееедленно, но растет.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн