思考ルーチンを別スレッドにすることは
できたが、だからといって他のタスクがサクサク
実行できるかというと実際はできないので
別タスクにした意味が殆どないと言わざるを得ない。
それにもめげずに
今度は思考ルーチンから途中経過の情報をもらい
思考ルーチンスレッドが終了するまでの間
それらを随時画面に表示させることを考えた。
スレッドにはスレッドの終了を検出する
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 画面上の途中経過の情報
直接思考ルーチンスレッド側で表示させればよいが、それだと
別モジュールに切り分け難いかなと思ったりする。
試験的には思考ルーチンサイドで画面表示させることが
手っ取り早い解決策にはなりそうだが。