|
Внешняя компонента 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 раз. Теперь память увеличивается крайне неохотно. Это не совсем корректное решение, потому что все равно занимаемая память мееедленно, но растет. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |