コンソールアプリだ!
C#で、動的なコンソールアプリを作りたいぜ!
そんな溢るる衝動を抑えきれず、猫をもふもふするのである。そう、そんな時は、「猫でもわかるプログラミング」に限るんだぜ!
そんなわけで(どんなわけだ、)猫でもわかるプログラミングのC#コンソール編より、第49章と第50章に挑戦でーす(`_´)ゞ
http://www.kumei.ne.jp/c_lang/cs/cs_49.htm
http://www.kumei.ne.jp/c_lang/cs/cs_50.htm
…あ、挑戦と言ってもですね、やったことは、リンク先からソースコードを丸コピして、コンパイルしただけっス。
見事、コンソールウィンドウの中でボールが跳ね回るプログラムと、一秒ごとに時間表示を更新するデジタル時計プログラムが完成しましたー。詳しくは、リンク先を見てくださいねー!
…といってサクっと終わろうと思ったのに。
妙なことに気がついてしまいました。
最初に作った49章のプログラム「event03.exe」、コンソールウィンドウの中を色が変わるボールが縦横に動き回る、動きの大きなアニメーションらしいアニメーションです。
一方次の50章のプログラム「event04.exe」、時間表示のテキストが書き換わるだけの、地味なアニメーションです。
一見、処理的にevent03.exeの方がevent04.exeより重そうな気がします。
ところがですね、04を動かしてる時に、PCのCPU使用率がえらく多いことに気がつきました。
ん?
ご覧の通り、03のCPU使用率はゼロ近いのに、04はかなりCPUを使っているようです。
同じC#コンソールアプリでアニメーションしてるのに、なぜ、こんなに大きな差が出る?
両者を比べてみます。
どちらも、while(true)で無限ループを作って、その中で表示処理を動かしています。これが、C#コンソールアプリで動きのあるプログラムを作る時の、作法であるようです。
そして、表示処理以外で、ひとつ、大きく違う点がありました。
「スレッドを使っている」というところです。
03は、ボールが動く速度を一定に保つため、ループが回るたびに「スレッドを30ミリ秒停止する」という処理を入れています。これが、無限ループを動かし続けているにもかかわらず、CPU使用率が常にゼロ近い秘密です。
一方その処理が無い04は、がんばってPC上のCPUリソースをめいっぱい使って、無限ループを動かそうとしています。他のプログラムの迷惑顧みず。
てことはですよ。
04の方にも、スレッドを停止する処理を入れてしまえばよくね?
そんなわけで、さっき言ってたwhile(true)の次の行に、以下の処理を入れてみました。
System.Threading.Thread.Sleep(1);
やった!やった!
やったよ!パパは!(原田雅彦)
唐突にまとめ
コンソールプログラムで動きのあるプログラムを作るために、無限ループなんか回したら、CPUをめたくそムダづかいしてしまうッ!
必ず、スレッドの停止を入れて、CPUのムダづかいをやめるんだ!
おこづかいのムダづかいもやめるんだ!
お兄さんとの約束だぞ!
…以上だぜ?(杉ちゃん)


