2011-12-08 2 views
3

나는 통계 데이터를 저장하기 위해 sqlite db를 사용하는 as3 app을 가지고있다. as3은 싱글 스레드이므로,이 db에 저장할 때, 내가 연주하고있는 스테이지 비디오가 급격히 움직이는 것으로 알려져 있습니다! 나는 의사 스레딩 예제로 보았다sqlite DB에 최적화 저장 하시겠습니까?

for (var i:int=0; i < metricsObject.metricsComponentData.length; i++){ 
    switch (metricsObject.metricsComponentData[i].mouseType) { 
     case MetricsCollator.MOUSE_OVER: 
      this._query_txt = "INSERT INTO " + this._tablePath[0] + " VALUES (null, " + this._sessionID + 
                    ", " + metricsObject.metricsComponentData[i].timeStamp + 
                    ", '" + metricsObject.metricsComponentData[i].component + "'" + ")"; 
        break; 
     case MetricsCollator.MOUSE_OUT: 
      this._query_txt = "INSERT INTO " + this._tablePath[1] + " VALUES (null, " + this._sessionID + 
                    ", " + metricsObject.metricsComponentData[i].timeStamp + 
                    ", '" + metricsObject.metricsComponentData[i].component + "'" + ")"; 
        break; 
     } // end switch 
    executeQuery(this._query_txt); 
} // end loop 

하지만 그들은 모두가 스프라이트 또는 단계 인스턴스를 필요로하는 클래스 I가 실행하고, : 나는 루프에 저장할 수 있도록 일괄 DB 데이터를 저장하는 것이이 과정의 속도를 높일 수 있다고 들었습니다 이 코드는 디스플레이 클래스가 아니며,이 클래스에 스테이지의 인스턴스를 전달하고 싶지는 않습니다. 더러운 것처럼 보입니다! ;-)

누구든지 아이디어가 있습니까?

답변

1

의사 스레드의 대부분의 예제는 표시 객체와 입력 프레임 수신기를 사용하지만 Timer을 사용할 수도 있고 응용 프로그램에 일종의 업데이트 루프가있는 경우에도 사용할 수 있습니다.

가 여기에 Timer 사용하여 간단한 예제 :없는 경우, 비동기 쿼리를 실행하고 있는지 확인, 또한

package { 
    import flash.display.Sprite; 
    import flash.events.TimerEvent; 
    import flash.utils.Timer; 

    public class PseudoThreadExample extends Sprite { 

     private var _timer:Timer; 

     public function PseudoThreadExample(){ 
      // create a timer that runs with a low interval 
      // tweak this to fit your needs! 
      _timer = new Timer(30, 0); 
      _timer.addEventListener(TimerEvent.TIMER, handleTick); 
     } 

     public function startWorking():void { 
      // put work to be done in list here 
      // in your case that will probably mean making an array of SQL- 
      // statements to run later 
      _timer.start(); 
     } 

     public function handleTick(event:TimerEvent):void { 
      // pop a thing off the list and do it. 
      // if list is empty, stop the timer 
      _timer.stop(); 
     } 
    } 

} 
+1

을 실행 그들이 끝날 때까지 기다려야 중지됩니다! – grapefrukt

+0

그래서 명확히 할 수 있습니까? handleTick()에서 startWorking()을 호출하여 시간 단위로 DB에 저장해야합니다. 그런 다음 타이머를 마쳤습니까? 따라서 DB 저장을 루프에서 제거해야합니까? 건방진 응답을위한 –

+0

번호. 외부에서 startWorking을 호출하면 handleTick이 타이머를 중지 할 때까지 호출됩니다. 이렇게하면 "스레딩"이 외부에 투명 해 지므로 평상시와 같이 저장 전화를 걸면 시간이 지남에 따라 전화가 걸립니다. – grapefrukt

관련 문제