Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash Приложения: AIR, Zinc и тд. (http://www.flasher.ru/forum/forumdisplay.php?f=94)
-   -   Течет память ExternalInteface (http://www.flasher.ru/forum/showthread.php?t=130713)

nick_van_rijn 02.10.2009 14:53

Течет память ExternalInteface
 
Помогите кто может, при частом вызове функций Flash из конетейнера течет память - мегабайтам.... думал что то в коде, выключил весь код как в контейнере так и во флэше, все тоже самое, значит дело именно в вызовах ExternalInterface.... не срабатывает GC и все тут, когда вызовов нет или flash работает внутри себя память не течет может кто сталкивался, принимаются самые буйные идеи... (GC насильно запускал разными способами, 0 результата).


нашел одно упоминание о проблеме I'm having trouble with a memory leak in my application. I'm hoping someone out there can help me find a fix or workaround, or tell me what I'm doing wrong.The leak seems to be coming from the flash external interface; specifically, IShockwaveFlash.SetReturnValue(String). My application is written in Visual Basic 2008, connecting to Flash 9.0.124.0 (activex version).I've written a fairly simple flash/VB program pair to illustrate the problem.The SWF contains a button, 2 dynamic text fields, and the ActionScript 2 code below.The VB project contains a Form with a AxShockwaveFlash object and the VB code below.When this program is run, and the button is clicked a lot (10's of thousands of times), the application's memory creeps up and never seems to fall back down. If the string passed to SetReturnValue is longer, memory is consumed faster. But if the call to SetReturnValue is commented-out, the application's memory usage remains stable.If anyone has any suggestions on how to proceed, I'd be grateful.(By the way: I'm using a freeware program called DoItAgain to automate the button pressing.) но идей решения не послеовало... я в общем то уже смирился с тем что течет flash10.ocx и все же....

Adobe Flash CS3, Delphi + flash10.ocx, FlashPlayer 10,0,32,18

Добавлено через 20 минут
[IMG]http://pic.************/uploads/091002/C7ZRVSRk1V.jpg[/IMG]
вот тут часто вызываются методы флэша без единой строки кода но видно какими объемами течет память.

alexcon314 02.10.2009 16:27

Человек пишет на .NET, вы на дэлфи. Там юзаются какие-то хитрые обертки для плеера, я знаю. Чего там течет-сказать трудно. Сделал свой пример на SetReturnValue и CallFunction.
http://mdm-zinc.narod.ru/pub/res.zip
CallFunction вызывается по правой кнопке, SetReturnValue происходит по нажатию на кнопку Button в окне плеера.
Посмотрите, сравните. Кода там тоже практически нет. Память подтекает, но чтоб катастрофичемки.. нет, пожалуй.
Да, плеер тоже 10, AS2-ролик.

nick_van_rijn 02.10.2009 17:00

спасибо за пример, действительно по сравнению с моей утечкой, тут можно считать стабильной память,на чем написан код контейнера? среди включенных модулей нет Flash10b.ocx на который я и грешу...
код вызова флэш функции
Код AS3:

// XMLDoc.XML.Strings - имя метода и его параметры 
res:=FlashObject.CallFunction(XMLDoc.XML.Strings[1]);

код получения ответа от флэша

Код AS3:

procedure TMyFlashGameSea.CallByFlash(ASender : TObject; const ARequest : WideString);
var //сюда попадаем когда флэш вызывает метод паскаля
    //ARequest- xml запрос с именем метода и его параметрами
 Method : string;
 iParameters : TVarArray;
begin
 FRetFlash(ARequest, Method, iParameters); //разбираем XML
 
 if Method = 'Log' then
  begin ....

и когда это происходит многократно начинается лавинообразная утечка.... с ощущением что CallFunction слабо синхронна основному потоку

Добавлено через 19 минут
для флэша так:
Код AS3:

// делаем доступными  для внешнего контейнера функции
                ExternalInterface.addCallback ("AddWinTableString",AddWinTableString);
        ExternalInterface.addCallback ("ChangeWinTableSttring",ChangeWinTableString);...
 тела функций пустые

Код AS3:

Тут вызываем метод делфи
ExternalInterface.call("Log","Нажата кнопка


alexcon314 02.10.2009 17:21

Пример малость подправил, несущественно.
Написан пример на С++ и ATL. Flash10а.ocx и сам мувик сидят в ресурсах, можете посмотреть резхакером. Оттуда и грузятся. По вашему коду сказать мало что могу, дэлфями занимался мало.
Попробуйте версию плеера пониже, что ли.. не знаю, чем вам помочь. Видимо, дело таки в обертке.
Код С++
Код:

HRESULT  CFlashEventDispatch::FlashCall_Handler (_bstr_t request)
{
// request не анализирую, ибо пример.
        CString msg = "<string>SetReturnValue rules ";
        CString t;
        static int i = 0;
        t.Format(L"%X",i);
        m_spPlayer->SetReturnValue(_bstr_t(msg+t+" times!</string>"));
        i++;
    return S_OK;
}
...
LRESULT CFlashHost::OnRButtonDown(UINT /* uMsg */, WPARAM /* wParam */, LPARAM /* lParam */, BOOL& bHandled)
{
        static int i = 0;
        CString msg = "<invoke name=\"newfunc\" returntype=\"xml\"><arguments><string>Call Function rules ";
        CString t;
        t.Format(L"%d",i);
        m_spPlayer->CallFunction(_bstr_t(msg+t+" times!</string></arguments></invoke>"));
        i++;
    return 0;
}

Код AS 2.0
Код:

import flash.external.*;
btn.onRelease = function() {
        out.text = String(ExternalInterface.call("sayHello", "по-фик что"));
};
function newfunc(arg:String):Void {
        out.text = arg + newline;
}
ExternalInterface.addCallback("newfunc", this, newfunc);


wvxvw 02.10.2009 17:41

Я думаю, что эти вещи связаны:
http://bugs.adobe.com/jira/browse/TH-6308
http://bugs.adobe.com/jira/browse/TH-6486 < тут говорится, что вроде как пофиксили... но, судя по коментам - не понятно толком...

alexcon314 02.10.2009 17:48

Login required на обеих ссылках.

nick_van_rijn 02.10.2009 17:59

[IMG]http://pic.************/uploads/091002/7VSo3Uoa7b.jpg[/IMG]
вот тут все что загружает процесс res
[IMG]http://pic.************/uploads/091002/aqzoUWA244.jpg[/IMG]
а тут то что загружается у меня

wvxvw 02.10.2009 18:05

Сорри, очевидно это "внутренний" репорт... просто почему-то JIRA мне показывает: Security Level:Public (All JIRA Users )...
Там говорится про оболочку для плеера в каталисте, но кто-то обмовливлся о том, что флешевый родной код не освобождал строку полученую извне... мне тяжело понять о чем именно речь т.как там используют какие-то юнит тесты, которых у меня нет, да и билдить каталист я все равно не могу...
Но даже если это так, то все равно помочь этому делу никак нельзя... ни из плеера ни из кода вне обертки...

nick_van_rijn 02.10.2009 18:07

я для вызова флэш функции использую CallFunction, и подписаное событие для получения ответа, такое взаимодействие везде описано как штатное,SetReturnValue не использовал.... везде AS3

Добавлено через 15 минут
Еще сомнения...ExternalInterface.addCallback для всех функций делаю в конце точки входа, все открываемые функции находятся ниже, не может быть чего плохого?

alexcon314 02.10.2009 19:13

Ну, списки не очень различаются, плеер-то один и тот же...
Цитата:

я для вызова флэш функции использую CallFunction, и подписаное событие для получения ответа, такое взаимодействие везде описано как штатное,SetReturnValue не использовал.... везде AS3
Не очень понял, вроде CallFunction синхронный.
Цитата:

Еще сомнения...ExternalInterface.addCallback для всех функций делаю в конце точки входа, все открываемые функции находятся ниже, не может быть чего плохого?
Тоже поясните, плиз. Не догоняю...что за точка входа, какие функции и почему они ниже?
На выходных попробую потерзать res.exe. Будет что-то интересное, отпишусь.

UPD:
Сделал пример с AS 3.0.
При старте имеем 17'560 Кб. Лики больше и чаще на SetReturnValue, FlashCall тоже течет, но процентов на 70% умереннее, на глаз. После нескольких сотен (350~400)вызовов вперемешку, но с перевесом на SetReturnValue, имеем ~20'250Кб. Однако, в какой-то момент расход скачкообразно уменьшается до ~18'500Кб и после этого лики идут вяло и в большинстве гасятся.
С AS 2.0 - роликом на старте имеем 16'480 Кб. Лики идут примерно вровень на обоих вызовах, на ~ 450 вызовах вперемешку расход догнал до ~17'100. Дальнейшие лики почему-то практически не происходят.

Исходник поправил так, что CallFunction возвращает результат, происходит это синхронно, так что про события, повторюсь, не понял.
Код:

HRESULT  CFlashEventDispatch::FlashCall (_bstr_t request)
{
        //::MessageBox(NULL,request,L"FlashCall request",0);
        static int i = 0;
        CString msg = "<string>SetReturnValue rules ";
        CString t;
        t.Format(L"%d",i);
        _bstr_t ret = _bstr_t(msg+t+" times!</string>");
        HRESULT hr = m_spPlayer->SetReturnValue(ret);
        i++;
    return S_OK;
}
...
LRESULT CFlashHost::OnRButtonDown(UINT /* uMsg */, WPARAM /* wParam */, LPARAM /* lParam */, BOOL& bHandled)
{
        static int i = 0;
        CString msg = "<invoke name=\"newfunc\" returntype=\"xml\"><arguments><string>FlashCall rules ";
        CString t;
        t.Format(L"%d",i);
        _bstr_t res = m_spPlayer->CallFunction(_bstr_t(msg+t+" times!</string></arguments></invoke>"));
        //::MessageBox(NULL,res,L"CallFunction response",0);
        i++;
    return 0;
}

Да, почему в вашем списке подгруженных модулей Flash.ocx присутствует дважды?

res3.zip (c AS 3.0) положил рядом с обновленным res.zip (с мессаджбоксами) на народе там же в pub. Плеер 10а.

nick_van_rijn 05.10.2009 12:31

Цитата:

Не очень понял, вроде CallFunction синхронный.
Да конечно синхронный.
Цитата:

Тоже поясните, плиз. Не догоняю...что за точка входа, какие функции и почему они ниже?
Спасибо, я тоже продолжу эксперименты. Точка входа это функция (конструктор) класса документа, от сюда начинается исполнение всего кода, потому и называют ее точкой входа. Так вот в ней сразу и делаю addCallback, а сами функции описаны дальше в коде класса, в общем и сам понимаю что не имеет значения это.Подумав решил что единственный мой код это код формирование и парсинг XML в структуры паскаля, буду искать там....
почему ocx дважды вопрос за семью печатями, скорее всего обертка как то хитро работет с ним.
alexcon314 спасибо за ответы


Часовой пояс GMT +4, время: 22:33.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.