Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 02.12.2010, 23:06
alexg вне форума Посмотреть профиль Отправить личное сообщение для alexg Найти все сообщения от alexg
  № 1  
Ответить с цитированием
alexg

Регистрация: Dec 2010
Сообщений: 12
По умолчанию Парсинг файлов средствами URLStream

Здравствуйте!

Сразу хочу заметить, что я новичок как на этом форуме, так и в вопросах ActionScript в частности. Поэтому сильно прошу не пинать.

Идея моя заключается в следующем: пользователь скармливает флэшу файл (в общем случае - локальный файл через URLRequest), этот файл начинает загружаться URLStream и как только хватает данных для парсинга файла, закачка прерывается.

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

Вот такой небольшой класс реализует чтение (простейший набросок)

Код AS3:
package Classes.Data
{
	// импорт стандартных классов
	import flash.net.*;
	import flash.errors.*;
	import flash.events.*;
 
	//==============================================
	// класс 
	public class CommonDataParser
	{
		//==============================================
		// данные класса
		//
		private var m_loader:URLStream;
 
		//==============================================
		// конструктор
		//
		public function CommonDataParser ()
		{
			trace ("CommonDataParser - constructor");
			m_loader = new URLStream ();
		}
 
		//==============================================
		// "destructor"
		//
		public function destroy ()
		{
			trace ("CommonDataParser - destructor");
			if (m_loader != null)
			{
				if (m_loader.connected)
				{
					m_loader.close ();
				}
 
				m_loader.removeEventListener (Event.COMPLETE, completeHandler);
				m_loader.removeEventListener (HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
				m_loader.removeEventListener (IOErrorEvent.IO_ERROR, ioErrorHandler);
				m_loader.removeEventListener (ProgressEvent.PROGRESS, progressHandler);
				m_loader.removeEventListener (SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
 
				m_loader = null;
			}
		}
 
		//==============================================
		// методы
		//
		public function parse (filePath:String):void
		{
			if ((filePath != null) && (filePath.length > 0))
			{
				trace ("File path: " + filePath);
				var req:URLRequest = new URLRequest(filePath);
 
				m_loader.addEventListener (Event.COMPLETE, completeHandler);
				m_loader.addEventListener (HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
				m_loader.addEventListener (IOErrorEvent.IO_ERROR, ioErrorHandler);
				m_loader.addEventListener (ProgressEvent.PROGRESS, progressHandler);
				m_loader.addEventListener (SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
 
				try
				{
					m_loader.load (req);
				}
				catch (error:Error)
				{
					trace ("Unable to load requested URL: " + error);
				}
			}
		}
 
		private function completeHandler (event:Event):void
		{
			trace ("completeHandler: " + event);
		}
 
		private function progressHandler (event:Event):void
		{
			trace ("progressHandler: " + event);
			if (event.target.bytesAvailable > 200000)
			{
				trace ("available: " + event.target.bytesAvailable);
				destroy();
				trace ("CommonDataParser - after destroy");
			}
		}
 
		private function securityErrorHandler (event:SecurityErrorEvent):void
		{
			trace ("securityErrorHandler: " + event);
		}
 
		private function httpStatusHandler (event:HTTPStatusEvent):void
		{
			trace ("httpStatusHandler: " + event);
		}
 
		private function ioErrorHandler (event:IOErrorEvent):void
		{
			trace ("ioErrorHandler: " + event);
		}
	}
}
В принципе, скрипт работает как надо - после вызова метода parse ("Имя_файла") оттуда читается всё, что надо, потом закрывается, удаляется, НО - после этого флэш-плеер висит как минимум с десяток секунд без отклика на мышь. Потом (через эти злосчастные десять секунд) всё приходит в норму и плеер снова реагирует на команды. Чем больше файл (я пробовал вплоть до 4 Гб), тем дольше эта пауза после "обрыва" загрузки. Никаких исключений и ошибок не выбрасывается.

Замечал по диспетчеру задач, что памяти особо много на выполнение не уходит, да и проц не сильно подгружается, но наглухо виснет после последнего обновления экрана вслед за окончанием парсинга.

Вопрос - с чем это может быть связано, как это можно победить и вообще, можно ли?
Может есть другой способ реализации парсинга файлов любой структуры без необходимости их полной загрузки в память (кроме как на Air)?

ПС
Система Win XP 32bit, Adobe Flash CS4, AS3.0

Спасибо.


Последний раз редактировалось alexg; 02.12.2010 в 23:10.
Создать новую тему Ответ Часовой пояс GMT +4, время: 00:59.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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