2015-07-22 1 views
2

Сегодня я попытался выполнить некоторую фоновую работу с классом рабочего класса AS3.AS3 Рабочий не работает должным образом во время отладки или выпуска Flash CC CC, за исключением тех случаев, когда опубликовано

Однако я испытываю странное поведение, когда developping мой AIR настольных приложений в Flash-CC на Windows 7. Рассмотрим простой файл для основного «нить»:

//////////////// 
// MainThread.as 
//////////////// 
package{ 
    import flash.display.*; 
    import flash.system.*; 
    import flash.events.*; 
    import flash.utils.*; 
    public class MainThread extends MovieClip 
    { 
     [Embed(source="WorkerThread.swf", mimeType="application/octet-stream")] 
     private static var WORKER_SWF:Class; 

     var mainToWorker:MessageChannel; 
     var workerToMain:MessageChannel; 
     var workerToMainStartup:MessageChannel; 

     public function MainThread() 
     { 
      var workerBytes:ByteArray = new WORKER_SWF() as ByteArray; 
      var worker:Worker = WorkerDomain.current.createWorker(workerBytes, true); 

      // Send to worker 
      mainToWorker = Worker.current.createMessageChannel(worker); 
      worker.setSharedProperty("mainToWorker", mainToWorker); 

      // Receive from worker 
      workerToMain = worker.createMessageChannel(Worker.current); 
      workerToMain.addEventListener(Event.CHANNEL_MESSAGE, onWorkerToMain); 
      worker.setSharedProperty("workerToMain", workerToMain); 

      // Receive startup message from worker 
      workerToMainStartup = worker.createMessageChannel(Worker.current); 
      workerToMainStartup.addEventListener(Event.CHANNEL_MESSAGE, onWorkerToMainStartup); 
      worker.setSharedProperty("workerToMainStartup", workerToMainStartup); 

      worker.start(); 

      trace("hi"); 
     } 

     private function onWorkerToMain(ev:Event): void 
     { 
     } 

     private function onWorkerToMainStartup(ev:Event): void 
     { 
      var success:Boolean = workerToMainStartup.receive() as Boolean; 
      trace(success); 
      if (!success) 
      { 
       // ... handle worker startup failure case 
      } 
     } 
    } 
} 

а затем этот файл для рабочего (SWF-файл этого построен в FlashDevelop):

////////////////// 
// WorkerThread.as 
////////////////// 
package{ 
    import flash.display.MovieClip; 
    import flash.display.Sprite; 
    import flash.system.*; 
    import flash.events.*; 
    import flash.filesystem.*; 

    public class WorkerThread extends MovieClip 
    { 
     public var mainToWorker:MessageChannel; 
     public var workerToMain:MessageChannel; 
     public var workerToMainStartup:MessageChannel; 

     public function WorkerThread() 
     { 
      // Receive from main 
      mainToWorker = Worker.current.getSharedProperty("mainToWorker"); 
      mainToWorker.addEventListener(Event.CHANNEL_MESSAGE, onMainToWorker); 

      // Send to main 
      workerToMain = Worker.current.getSharedProperty("workerToMain"); 

      // Send startup message to main 
      workerToMainStartup = Worker.current.getSharedProperty("workerToMainStartup"); 
      workerToMainStartup.send(true); 

      trace("Hello from worker world."); 
      var file:File = File.desktopDirectory.resolvePath("MyTextFile.txt"); 
      var stream:FileStream = new FileStream(); 
      stream.open(file, FileMode.WRITE); 
      stream.writeUTFBytes("ZA WARUDO."); 
      stream.close(); 
     } 

     private function onMainToWorker(event:Event): void 
     { 
     } 
    } 
} 

Вот проблемы, я испытывающие при создании и запуске приложения из Flash-CC:

  • Следы от рабочего мира не могут быть обнаружены в отладчике Flash CC.
  • Слушатель onWorkerToMainStartup никогда не запускается, несмотря на работу рабочего (трассировка worker.state после короткой задержки подтвердит это).
  • Работник должен написать файл, но это никогда не произойдет.

Однако ...

  • Работник запишет файл, как только я перестану отладчик в Flash-CC.
  • После публикации приложения и его выполнения из проводника Windows он работает так, как должно быть (это означает, что файл написан в фоновом режиме, в то время как приложение запускается, как и ожидалось).

Это безумие. Почему это происходит?

Спасибо.

ответ

1

У меня были подобные проблемы некоторое время назад.

Мне никогда не удавалось выводить вывод трассировки в отладчик. Однако мне удалось найти выходной тракт рабочего в файле журнала txt здесь: %APPDATA%\Macromedia\Flash Player\Logs\

Как для SWF-файла рабочего не продвигаться во время отладки - попробуйте скомпилировать SWF рабочего рабочего как Release, а не Debug.

Смежные вопросы