Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Flash > чтоб из функции не возвращалось , пока...


Автор: PROCESSOR 29.8.2005, 22:12
Есть функция: q=load('file.txt')

в load - происходит простая загрузка файла. Но мне надо, чтобы пока загрузка не законичилось - выхода из load не происходило.

Как я понимаю, надо сделать вечный цикл, проверяющий установленна переменная ( конца загрузки или нет ) и тогда выходить. Но чото не получается - при вечном цикле - FLASH виснет.

Можно пример плиз.

Щас пока юзаю - вызов указанной функции по загрузке . Но это не красиво.

Автор: AntonioBanderaz 29.8.2005, 22:23
Делай через XML, в нём определены свойства или параметры, как кому угодно, getBytesLoaded() и getBytesTotal()
Вешаешь на XML листинер и проверяешь когда эти два параметра будут равны, тогда и типо загрузился твой файл полностью... Я те попозже примерчик накатаю и кину...

Автор: PROCESSOR 29.8.2005, 23:44
AntonioBanderaz

Я это знаю. Мне другое нужно.

Код

XML.prototype.ignoreWhite = true;

function load(q) {
    xml=new XML()
    xml.onLoad=function (rez) { trace ("1") }
    xml.load (q)
    }

load ("txt.xml")
trace ("2")


Надо чтобы 2 появилось после 1 ( trace смотри ). т.е. пока не выполнилось действие onLoad - выхода из функции load не было.

Если задать вопрос по другому - можно ли как-то остановить код на месте, пока не выполниться условие. Вродебы простой вечный цикл , где проверяется переменаая и всё... но почему FLASH виснет.




Автор: AntonioBanderaz 30.8.2005, 04:23
А мне интерестно зачем тебе это надо?
Что у тебя в цикле стоит? Какой код вообще?


Автор: PROCESSOR 30.8.2005, 05:19
Код


function load(q) {
    xml=new XML()
    xml.onLoad=function (rez) { xml.q=false}
    xml.q=true
    xml.load (q)
    while (xml.q) { }   
    }



примерно так. Но таким циклом он даже загрузку не делает - виснет сразу. Если чото в цикл вставлять не помогает.


Автор: AntonioBanderaz 30.8.2005, 11:01
попробуй чуток поменять...


Код

function loadUrl(url:String) {
    var xml:XML = new XML();
    var checkL:Boolean = true;
    var temp:Boolean = true;
    function isLoad():Boolean {
        return checkL;
    }
    xml.onLoad = function(rez:Boolean) {
        checkL = false;
    };
    xml.load(url);
    while (temp) {
        temp = isLoad();
    }
}


Я не уверен что он здесь не зависнит, у Flash'a на этот счёт свои заморочки, типо как с рекурсией, только 256 вложений может быть, да и прикинь, что будет если у человека комп слабый... Cltkfk ,s aeyrwbzvb b yt vfzkcz/// =)

Автор: AlDev 30.8.2005, 16:10
если для файла с переменными - юзай loadVars

Автор: AntonioBanderaz 31.8.2005, 02:04
Alex Batsuev -ему-же другое нужно, ему нужен аналог wait(); т.е. остановить выполнение кода пока что-то там не будет равно чуму-то там... Это прикольно конечно, удобненько станет, если сделать чтобы ресурсы проца в это время не жрал бесконечными переборами и циклами, рекурсиями, и прочей подобной байдой "ВАЩЕ" супер было бы...

Автор: AlDev 31.8.2005, 04:10
Цитата(PROCESSOR @ 30.8.2005, 03:12)
в load - происходит простая загрузка файла. Но мне надо, чтобы пока загрузка не законичилось - выхода из load не происходило.

Как я понимаю, надо сделать вечный цикл, проверяющий установленна переменная конца загрузки или нет и тогда выходить. Но чото не получается - при вечном цикле - FLASH виснет.


проще просто передавать ссылку на объект, где ьписано событие onLoad.

как вариант, делай setInterval:
Код

class fileLoader
{
  private var listObject:Object;
  private var loadCheckInterval:Number;
  private var is_loaded:Boolean;
  //-- class constructor
  public function fileLoader()
  {
  }
  //-- load file
  public function load(url:String):Void
  {
    this.is_loaded = false;
    this.loadCheckInterval = setInterval(this.checkLoading,1,this);
  }
  //-- add listener
  public function setListener(list:Object):Void
  {
      this.listObject = list;
  }
  //-- check file loading
  private function checkLoading(ths:Object):Void
  {
    if (ths.is_loaded)
    {
        ths.listObject.onLoad();
        clearInterval(ths.loadCheckInterval);
    }
  }
}

//------------
// usage:
var fl:fileLoader = new fileLoader();
var list:Object = new Object();
list.onLoad = function()
{
    trace ('loaded');
}
fl.setListener(list);
fl.load('data.txt');


в load добавь свой код. Тогда ты просто создаешь событие, проверяющее загрузку.
Дело в том, что с функцией очень тяжело в этом плане работать и проще просто создать событие или установить property.

для работы с событиями можно юзать то, что я тут сверху понаписал
потом можно юзать класс mx.events.EventDispatcher
как 3-й способ - watch.

ещё кое-что интересное на эту тему от john-а:
http://potapenko.com/rus/articles/conveyor.htm

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)