C++簡単なタイマーを実現する方法の詳細

5694 ワード

インプリメンテーション分析
まず、タイマーのいくつかの機能を分析します.簡単なタイマーには、スタート、一時停止、停止、表示の基本機能が含まれています.これらの機能は、C++オブジェクト向けのプログラミング思想(OOP)で抽象化されています.タイマークラス(Timer)の4つのメンバー関数です.外部に残されたインタフェース(interface)だからです.
次に、タイマーの3つの状態を分析します.停止、運転中、一時停止(注意:一時停止は停止ではありません)では、タイマーの3つの状態をどのように記録しますか.
ここでは,ブール型の変数を用いてタイマの3つの状態を記録し,それぞれbool is_pause,bool is_stop、ここでは変数の命名に注意しなければならない.このように名を見て意味を知る.舌を吐くのはもちろんC++クラスのパッケージ性を体現するために,この2つのbool変数をタイマクラス(Timer)のプライベートメンバーとする.
実装方法
重要な問題が来ました.どうやって時間を実現しますか?ねえ、time()関数を知っていますか.簡単にtime関数を言います:この関数はtime.hヘッダファイルでは、Unix紀元(January 1 1970 00:00:00 GMT)から現在の時間の秒数を返し、長い整形(long)である.これにより、タイマの開始時にtime関数の戻り値を取得し、一時停止時の時間を変数に保存します.私たちが計時を開始すると、デッドサイクルに入り、常にtime()-で開始される時間が、現在のタイマの時間です.(焦らないで、具体的には下を見てください).この場合、開始時刻と一時停止時刻の時間を保存するには、タイマクラス(Timer)に2つのロング整形(long)変数:start_を追加する必要があります.time,pause_timeは、もちろんプライベート変数として使用されます.
まだ何か足りないみたい・・・現在のタイマの状態を外部に取得するには、タイマの状態を返す2つの関数が必要です.is_pause()タイマが一時停止しているかどうか、is_stop()タイマが停止しているかどうか、戻り値のタイプはboolです.
Timerのコンストラクション関数を忘れないでください.初期化の仕事に使います.
では、タイマークラスの設計が完了しました.コードは以下の通りです.

class Timer 
{ 
 private: 
 long start_time; 
 long pause_time; 
 //  bool        
 bool is_pause; //         (        ) 
 bool is_stop;//         
 public: 
 Timer(); 
 bool isPause(); //        
 bool isStop(); 
 //        (  ) 
 void Start(); 
 void Pause(); 
 void Stop(); 
 inline long getStartTime() {return start_time;} 
 void show(); 
}; 

次のタスクは、Timerのメンバー関数を実装することです............
まず、コンストラクション関数Timer::Timer()で、いくつかの初期化作業を完了します.

Timer::Timer() 
{ 
 is_pause = false; //         
 is_stop = true; 
} 

タイマーが計時を開始する前に停止状態にあるはずです!△タイマーは1つの状態しかありません.ぼんやりしないでください.
メンバー関数isPause()外部取得タイマが一時停止状態にあるかどうか、so easy

bool Timer::isPause() 
{ 
 if(is_pause) 
 return true; 
 else 
 return false; 
} 

isStop関数はisPauseと同様に1つのインタフェースにすぎず、外部にタイマの状態を取得させる:
bool Timer::isStop()  {      if(is_stop)          return true;      return false;  }  
次に、Timer::Start()関数の実装を示します.これは、タイマの開始時に実行する関数です.

void Timer::Start() //   
{ 
 if(is_stop) 
 { 
 start_time = time(0); 
 is_stop = false; 
 } 
 else if(is_pause) 
 { 
 is_pause = false; 
 start_time += time(0)-pause_time; //      :       -          +          =         
 } 
} 

まず、タイマの状態を判断し、停止状態にある場合は、開始時間を取得し、タイマの状態を更新します.タイマが一時停止状態にある場合、タイマを継続させ、開始したタイマの時間(start_time)を変更してタイマの時間を調整します:(このときの時間-一時停止にかかる時間+前回の開始時間=このときの開始時間).タイマーが動いている状態なら、何もしません!(皆さんが読めるかどうかはわかりませんが・・・)
これは、一時停止関数Timer::Pause()の実装です.

void Timer::Pause() //   
{ 
 if(is_stop||is_pause) //      /    ,         ,     
 return; 
 else //          
 { 
 is_pause = true; 
 pause_time = time(0); //       
 } 
} 

実行していない場合、つまり一時停止または停止状態にある場合は、何もせずに直接戻ります.そうでなければ、一時停止要求を処理します.一時停止の操作を行った以上、タイマーの状態を変更し、状態を一時停止に設定し、現在の時間を保存します(この一時停止の時間pause_timeは上の最初の関数で使用されます!).
次に停止関数Timer::Stop():を実装します

void Timer::Stop() //   
{ 
 if(is_stop) //         (      ),       
 return ; 
 else if(is_pause) //        
 { 
 is_pause = false; 
 is_stop = true; 
 } 
 else if(!is_stop) 
 { 
 is_stop = true; 
 } 
} 

停止状態の場合は、直接戻ります.そうでなければ、一時停止状態にある場合、タイマの状態がis_stop = true に変更される.そうでない場合は運転状態になり、タイマーの状態を直接停止に変更します.
時間を表示する関数Timer::show()を次に示します.

void Timer::show() 
{ 
 long t = time(0) - start_time; 
 gotoxy(35,12); 
 cout< 
 

ここでgotoxy(int x,int y)関数についてお話しします.その役割はコンソールのカーソルを座標(x,y)に位置決めすることです.show関数はデッドサイクルに置くので、出力の時間を1つの場所に印刷し、時間の更新を実現します(私は頭がいいのではないでしょうか).setw(int x)は出力を設定する字幅であり、setfill(char  ch)は文字の埋め込みを設定する.time関数は秒数,t/60/60は時間,t/60は分,t%60は秒数を返す.
次は主関数ですmain()

int main() 
{ 
 Timer t; 
 char ch; 
 hidden();//     
 system("color 02"); 
 gotoxy(35,12); 
 cout< 
 

Timer t;タイマーを定義します.hidden() ;コンソールカーソルを非表示にするために使用されます.必須ではありません.
次にデッドサイクルに入り、kbhit()関数はキーがあるかどうかを検出し、キーが0以外の値を返すと、キーが0を返さない.getch()でキーを取得し、
switch case分岐構造は異なるキーを処理する.
これで、私たちのタイマーの設計が完成しました!簡単な感じじゃないですか!舌を出す
実行結果を見てみましょう.
次に、このプログラムで使用するヘッダファイルを示します.

#include  
#include  
#include  
#include  
#include  
#include  

コードで使用される関数は次のとおりです.void gotoxy(int x,int y)

void gotoxy(int x, int y)//    ,x    ,y     
{ 
 COORD pos = {x,y};//(     ); 
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //      (      ); 
 SetConsoleCursorPosition(hOut, pos);//         ; 
} 
void hidden( )

void hidden()//     
{ 
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); 
 CONSOLE_CURSOR_INFO cci; 
 GetConsoleCursorInfo(hOut,&cci); 
 cci.bVisible=0;// 1   , 0    
 SetConsoleCursorInfo(hOut,&cci); 
} 

まとめ
以上はこの文章のすべての内容で、本文の内容がみんなの学习に対してあるいは一定の助けをもたらすことができることを望んで、もし疑问があればみんなは伝言を残して交流することができます.