Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Многопоточность в AS3 (http://www.flasher.ru/forum/showthread.php?t=205786)

GrafMine 21.12.2013 19:54

Многопоточность в AS3
 
Есть готовое приложение на AIR с использованием сокета, он может отправлять картинки на сервер.
Проблема : при отправке файла(картинки) все приложение стопориться, до тех пор пока картинка полностью не передастся .
Вопрос : как создать отдельный процесс(поток) не в убыток работоспособности целого приложения ?
Вопрос #2 : как прикрутить прогресслоадер к передачи по сокету ?(для наглядности)

кусок исходника передачи :
Код AS3:

                                var msg:ByteArray = new ByteArray(); 
                                var ba:ByteArray = new ByteArray();
                                var bmd:BitmapData=new BitmapData(1000,1000);
                                bmd.draw(photo);                               
                                var encoder:JPGEncoder = new JPGEncoder(100);                                 
                                ba = encoder.encode(bmd);
                                msg.writeBytes(ba);
                                try{
                                        socket.writeBytes(msg);
                                        socket.writeUTFBytes('fullsize');       
                                        socket.flush();
                                }catch (e:IOError){
                                        trace(e);
                                        currentState = "loggedOut";
                                        alarm_popup("ошибка связи");
                                }
                                trace(ba.length +" "+ba.endian);


alexcon314 21.12.2013 20:01

Worker?

GrafMine 21.12.2013 20:48

Цитата:

Сообщение от alexcon314 (Сообщение 1155704)

Однозначно это открытие для меня :rolleyes:, но я вижу что это только для загрузок в фоновом режиме.
Я могу ошибаться( а так скорее всего и есть ;) ) но прикрутить к отправке по сокету это не прикрутить.
Прогулил сразу по этому вопросу так : as3+socket+ worker , не получил чего ожидал...
то что я понял:
Код AS3:

{
        public function MainThread()
        {
                if (Worker.current.isPrimordial)
                {
                        startMainThread();
                }
                else
                {
                        startWorkerThread();
                }
        }
          //загрузка в фоновом режиме
        private function startMainThread(): void
        {
                // Use our own SWF bytes to create the worker thread
                var worker:Worker = WorkerDomain.current.createWorker(loaderInfo.bytes);
                // ... more main thread setup
                      // не понятно как даже прикрутить к воркеру получения не говоря уже об отправке через сокет
 
        }
 // продолжение работы основго приложения
        private function startWorkerThread(): void
        {
                // ... worker thread setup
        }

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

gloomyBrain 22.12.2013 22:49

GrafMine,
Worker никак не связан с загрузкой и/или выгрузкой чего-либо куда-либо. Это отдельный экземпляр FP, который можно запустить/убить из данного экземпляра FP и с возможностью общения между такими вот экземплярами. Вы можете передавать данные как с помошью копирования (2 или более потока полностью дублируют объекты, чтобы передавать их друг другу), так и разделяя их между Worker'ами (то есть 2 или более потока одновременно работают с 1 объектом). Можете почитать, например, здесь.
Должен заметить что на практике сталкивались с тем, что более 2 потоков (то есть один основной, в котором класс Main, и второй дочерний, запущенный из основного) иметь не стоит, это черевато внезапными падениями плеера на разных операционных системах.

PS
У сокета вообще-то есть событие на прогресс отправки. И еще - было бы интересно увидеть, как именно вы что-то по сокету отправляете, что у вас все зависает. Что-то мне подсказывает, что отправка по сокету не будет требовать много ресурсов, подозреваю что дело в операциях которые вы выполняете незадолго до отправки (кодирование в jpeg/png например).

Akopalipsis 22.12.2013 23:38

gloomyBrain я обязательно прочту статьи по Вашей ссылке, но у меня возник вопрос по Вашим словам - "более 2 потоков иметь не стоит". То есть, вворкером вообще лучше не пользоваться или я не правильно понял?

in4core 23.12.2013 01:22

Akopalipsis правильно понимаешь. Качественных потоков у АС3 нет, воркеры - это поделка на коленке, потому что многие вопили, что дайте нам ПОТОКИ! Полноценных потоков в ближайших версиях ФП не появится. Если только в АС4

Akopalipsis 23.12.2013 02:01

in4core Спасибо! А то я со вчерашнего дня всё придумываю, где бы их применить:)

GrafMine 23.12.2013 06:26

Цитата:

Сообщение от gloomyBrain (Сообщение 1155738)
GrafMine,
Worker никак не связан с загрузкой и/или выгрузкой чего-либо куда-либо. Это отдельный экземпляр FP, который можно запустить/убить из данного экземпляра FP и с возможностью общения между такими вот экземплярами. Вы можете передавать данные как с помошью копирования (2 или более потока полностью дублируют объекты, чтобы передавать их друг другу), так и разделяя их между Worker'ами (то есть 2 или более потока одновременно работают с 1 объектом). Можете почитать, например, здесь.
Должен заметить что на практике сталкивались с тем, что более 2 потоков (то есть один основной, в котором класс Main, и второй дочерний, запущенный из основного) иметь не стоит, это черевато внезапными падениями плеера на разных операционных системах.

PS
У сокета вообще-то есть событие на прогресс отправки. И еще - было бы интересно увидеть, как именно вы что-то по сокету отправляете, что у вас все зависает. Что-то мне подсказывает, что отправка по сокету не будет требовать много ресурсов, подозреваю что дело в операциях которые вы выполняете незадолго до отправки (кодирование в jpeg/png например).

Спасибо за советы, и кстате я протресил после вашего сообщению каждую строку в моем методе чтоб проверить где именно "подвисает" оказалось действительно при кодировании... что же в таком случае делать мне посоветуете?)

а на счет события event : outputProgress, работает он у меня как-то "кривовато" показывает всегда 0 и только в начале и все, пример :
Код AS3:

socket.addEventListener(OutputProgressEvent.OUTPUT_PROGRESS, socketOutputProgress);
protected function socketOutputProgress(e:OutputProgressEvent):void {
                                trace("OUTPUT PROGRESS => bytesPending: " + e.bytesPending + " / bytesTotal: " + e.bytesTotal + "\n");
                        }
//output:
//OUTPUT PROGRESS => bytesPending: 0 / bytesTotal: 575202


alatar 23.12.2013 13:26

Цитата:

что же в таком случае делать мне посоветуете?)
http://help.adobe.com/ru_RU/FlashPla...a.html#encode()

GrafMine 23.12.2013 14:52

Цитата:

Сообщение от alatar (Сообщение 1155766)

Спасибо огромное, если сравнивать по скорости то небо и земля... Правда пришлось повозиться с появившимися ошибками при его применении, ну гугл как всегда помог ;)

вопрос с OutputProgressEvent.OUTPUT_PROGRESS по прежнему открыт :rolleyes:


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

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