2011-12-08 6 views
3

私は、メトリクスデータを保存するためにsqliteデータベースを利用するas3アプリケーションを持っています。 as3はシングルスレッドであることはよく知られているので、私がこのdbに保存すると、私が演奏しているステージビデオが不安定になります!私はループ内で保存するように、バッチで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 

、私は実行していたクラスを、私は擬似スレッドの例に見てきましたが、彼らはすべてのスプライトやステージのインスタンスを必要としますこのコードは、表示クラスではありません、私は本当にこのクラスにステージのインスタンスを渡すしたくない、汚いようです! ;-)

誰にでもアイデアはありますか?

答えて

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

関連する問題