思考ルーチンを別スレッドにすることは

できたが、だからといって他のタスクがサクサク

実行できるかというと実際はできないので

別タスクにした意味が殆どないと言わざるを得ない。

 

それにもめげずに

今度は思考ルーチンから途中経過の情報をもらい

思考ルーチンスレッドが終了するまでの間

それらを随時画面に表示させることを考えた。

 

スレッドにはスレッドの終了を検出する

WaitForというメソッドがあるが、このメソッドは

実行中我々に何もさせてくれないので

途中経過の情報を得ることはできない。

 

したがって、WaitForを使わずに終了を検出しつつ

待っている間に途中経過情報が来ればそれを

表示させるルーチンを考えた。

 

それまでの流れ

thread = new ThinkingThread(true,xxxxxxxxxx)  //xxxx は思考ルーチン用のパラメータ

           最初のtrueはスレッドを即座に実行せずresumeメソッドが呼ばれたら実行するモードを指定

thread->Resume(); スレッドをここで初めて実行する

thread->WaitFor();//ここでスレッドの終了を待つ

 

変更した手順

thread = new ThinkingThread(true,xxxxxxxxxx)  //xxxx は思考ルーチン用のパラメータ

           最初のtrueはスレッドを即座に実行せずresumeメソッドが呼ばれたら実行するモードを指定

thread->Resume(); スレッドをここで初めて実行する

thread->WaitFor();//ここでスレッドの終了を待つ

 

while (!(thread->Finished))// Finishedはスレッドが終了したときにセットされるフラグ

 if (thread->MsgReady)  {//メッセージがあるというフラグ

      print_____ //メッセージの表示

      thread->MsgReady = false;//メッセージありフラグのクリア

}

 

という感じでコーディングしたが、短いメッセージというか

メッセージの更新が早いとついていかれずに

読み飛ばしてしまっている様子

図1 実際の途中経過の情報                       図2 画面上の途中経過の情報

 

直接思考ルーチンスレッド側で表示させればよいが、それだと

別モジュールに切り分け難いかなと思ったりする。

試験的には思考ルーチンサイドで画面表示させることが

手っ取り早い解決策にはなりそうだが。