查看: 708|回復: 1

[開發]倒數計時器

[複製鏈接]
  • TA的每日心情
    慵懶
    2015-4-10 14:18
  • 簽到天數: 78 天

    [LV.6]常住居民II

    176

    主題

    612

    帖子

    3959

    積分

    管理員

    Rank: 9Rank: 9Rank: 9

    積分
    3959

    台南一中資訊社新手達陣程式設計達人 - 2014

    發表於 2014-5-31 16:17:46 | 顯示全部樓層 |閱讀模式

    趕快加入我們來參與討論吧!

    您需要 登錄 才可以下載或查看,沒有帳號?加入我們

    x
    開發平台:Window
    編譯軟體:VC++ 2012 with EasyX library

    功能說明:應活動需求製作,內附多線程與互斥鎖的應用,供大家參考。
    下載點: https://docs.google.com/file/d/0Bzxow2VOUeFGZThVQzQ5NzJUczg/edit
    操作:
    畢典程式 新增點功能

    A 顯示
    B 開始計時
    暫停 / 繼續 都是E
    取消(如按錯按鍵) 都是 P
    5秒(大概)內歸0 兩下Z (避免按錯) 方法:指數衰退

    加M秒 I數字o
    減M秒 D數字o

    如+60秒
    I60O
    +150秒
    I150O

    取消(如按錯按鍵) 都是 P

    5秒(大概)內歸0 兩下Z (避免按錯) 方法:指數衰退

    原始程式碼:
    @20140602 By LFsWang
  • #include<cstdio>
  • #include<easyx.h>
  • #include<ctime>
  • #include<Windows.h>
  • #include<mmsystem.h>
  • #include<conio.h>
  • #include<cstdlib>
  • #include<sstream>
  • #include<cmath>
  • //ONLY C++ 11 Support!
  • #include<thread>
  • #include<future>
  • #include<mutex>
  • #include<chrono>

  • #pragma comment(lib,"winmm.lib")
  • #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

  • using namespace std;
  • //Global
  • mutex Lock;
  • mutex EndOfProc;
  • //BASIC Function
  • bool checkKeyDown(int kb){
  •     USHORT usResult=GetAsyncKeyState(kb);
  •     return usResult==(USHORT)0x8001;
  • }

  • void Blur(DWORD* pMem)
  • {
  •     int WinW=GetSystemMetrics(SM_CXSCREEN);
  •     int WinH=GetSystemMetrics(SM_CYSCREEN)-1;
  •     for(int i = WinW; i < WinW * WinH; i++)
  •     {
  •         pMem[i] = RGB(
  •             (GetRValue(pMem[i]) + GetRValue(pMem[i - WinW]) + GetRValue(pMem[i - 1]) + GetRValue(pMem[i + 1]) + GetRValue(pMem[i + WinW])) / 5,
  •             (GetGValue(pMem[i]) + GetGValue(pMem[i - WinW]) + GetGValue(pMem[i - 1]) + GetGValue(pMem[i + 1]) + GetGValue(pMem[i + WinW])) / 5,
  •             (GetBValue(pMem[i]) + GetBValue(pMem[i - WinW]) + GetBValue(pMem[i - 1]) + GetBValue(pMem[i + 1]) + GetBValue(pMem[i + WinW])) / 5);
  •     }
  • }

  • //Advance
  • char buffer[100];
  • void update(long t,string s = ""){
  •     cleardevice();

  •     int WinW=GetSystemMetrics(SM_CXSCREEN);
  •     int WinH=GetSystemMetrics(SM_CYSCREEN);
  •     int wordH=textheight("00:00:00");
  •     int wordW=textwidth("00:00:00");

  •     int dx=(WinW-wordW)/2;
  •     int dy=(WinH-wordH)/2;

  •     if(s.size()==0){
  •         int ms=t%CLOCKS_PER_SEC;
  •         t/=CLOCKS_PER_SEC;
  •    
  •         long hr=t/3600;t%=3600;
  •         long mi=t/60;t%=60;
  •         long se=t;
  •    
  •         sprintf_s(buffer,"%02ld:%02ld:%02ld",hr,mi,se,ms);
  •    
  •         outtextxy(dx,dy,buffer);
  •     }else{
  •         outtextxy(dx,dy,s.c_str());
  •     }
  •     FlushBatchDraw();
  • }

  • void SetFullScreen(){
  •     HWND hWnd=GetHWnd();
  •     int WinW=GetSystemMetrics(SM_CXSCREEN);
  •     int WinH=GetSystemMetrics(SM_CYSCREEN);
  •     Resize(NULL,WinW,WinH);
  •     SetWindowLong(hWnd,GWL_STYLE,GetWindowLong(hWnd,GWL_STYLE)-WS_CAPTION);
  •     SetWindowPos(hWnd,HWND_TOP,0,0,WinW,WinH,SWP_SHOWWINDOW);
  • }

  • void SetFont(){
  •     settextcolor(LIGHTRED);
  •     int WindowsWidth=GetSystemMetrics(SM_CXSCREEN);
  •     int fontsize;
  •     //00:00:00:000
  •     fontsize=(int)(WindowsWidth*0.9/6);
  •     settextstyle(fontsize,0,"Digital-7 Mono");
  • }

  • void procFlicker(string s,int limit){
  •     int k=0;
  •     while(k<limit){
  •         if(!EndOfProc.try_lock()){
  •             return ;
  •         }
  •         EndOfProc.unlock();

  •         if(k%6<3){
  •             update(0,s);
  •         }else{
  •             cleardevice();
  •             FlushBatchDraw();
  •         }

  •         k++;
  •         Sleep(100);
  •     }
  •     return ;
  • }

  • const int TLE=10800*CLOCKS_PER_SEC;
  • //const int TLE=10*CLOCKS_PER_SEC;
  • int StartTime;
  • int _tmpAdd;
  • bool pauseFlag=false;
  • void procClock(){
  •     int E;
  •     int distime;
  •     do{
  •         if(!EndOfProc.try_lock()){
  •             return ;
  •         }
  •         EndOfProc.unlock();

  •         Lock.lock();
  •         E=clock();
  •         distime=E-StartTime;
  •         int tm=TLE-distime;
  •         if(tm<0)tm=0;
  •         if(!pauseFlag){
  •             update(tm);
  •         }
  •         Lock.unlock();

  •         Sleep(20);
  •     }while(distime<TLE||pauseFlag);
  • }

  • char GetAvaibleInput(){
  •     if(checkKeyDown('0'))return '0';
  •     if(checkKeyDown('1'))return '1';
  •     if(checkKeyDown('2'))return '2';
  •     if(checkKeyDown('3'))return '3';
  •     if(checkKeyDown('4'))return '4';
  •     if(checkKeyDown('5'))return '5';
  •     if(checkKeyDown('6'))return '6';
  •     if(checkKeyDown('7'))return '7';
  •     if(checkKeyDown('8'))return '8';
  •     if(checkKeyDown('9'))return '9';
  •     if(checkKeyDown('O'))return 'O';
  •     if(checkKeyDown('P'))return 'P';
  •     if(checkKeyDown('Z'))return 'Z';
  •     return 0;
  • }

  • int main(){
  •     HWND hWnd;
  •     future<void> task;
  •     future_status::future_status taskStatus;

  •     //Init Graph
  •     hWnd=initgraph(1300,400);
  •     SetFont();
  •     SetFullScreen();
  •     BeginBatchDraw();

  •     //Wait
  •     while(1){
  •         if(checkKeyDown('A')){
  •             break;
  •         }
  •         Sleep(20);
  •     }
  •     Sleep(100);

  •     //Show 88:88:88
  •     task = async(procFlicker,"88:88:88",30);
  •     while(1){
  •         taskStatus = task.wait_for(std::chrono::milliseconds(0));
  •         if(taskStatus == future_status::ready){
  •             task.get();
  •             break;
  •         }
  •         Sleep(100);
  •     }
  •    
  •     //Show 03:00:00
  •     update(0,"03:00:00");
  •     while(1){
  •         if(checkKeyDown('B')){
  •             break;
  •         }
  •         Sleep(100);
  •     }
  •    
  •     ostringstream oss;
  •     //Main Clock
  •     StartTime=clock();
  •     string cmd;
  •     bool SetCmdFlag=false;
  •     bool Jumpflag=false;
  •     bool JumpLock=false;
  •     int  timeAddFlag=1;
  •     int pauseStart=0;
  •     //mulit thread
  •     task=async(procClock);
  •     while(1){
  •         taskStatus = task.wait_for(std::chrono::microseconds(0));
  •         //check if clock finished
  •         if(taskStatus == future_status::ready){
  •             task.get();
  •             break;
  •         }
  •         //GetCommandFlag
  •         if(checkKeyDown('I')){
  •             SetCmdFlag=true;
  •             timeAddFlag=1;
  •             cmd="";
  •         }
  •         if(checkKeyDown('D')){
  •             SetCmdFlag=true;
  •             timeAddFlag=-1;
  •             cmd="";
  •         }
  •         if(checkKeyDown('E')){
  •             Lock.lock();
  •             pauseFlag=!pauseFlag;
  •             if(pauseFlag)
  •             {
  •                 pauseStart=clock();
  •             }
  •             else
  •             {
  •                 int nowclock=clock();
  •                 StartTime+=nowclock-pauseStart;
  •             }
  •             Lock.unlock();
  •         }
  •         if(checkKeyDown('Z')){
  •             if(JumpLock){
  •                 Jumpflag=true;
  •                 EndOfProc.lock();
  •                 task.get();
  •                 EndOfProc.unlock();
  •                 break;
  •             }
  •             else{
  •                 JumpLock=true;
  •             }
  •         }
  •         if(checkKeyDown('P')){//Fail
  •             SetCmdFlag=false;
  •             JumpLock=false;
  •         }
  •         if(SetCmdFlag){
  •             char t=GetAvaibleInput();
  •             if(t=='O'){//run
  •                 int ad=atoi(cmd.c_str());
  •                 Lock.lock();
  •                 StartTime+=ad*CLOCKS_PER_SEC*timeAddFlag;
  •                 Lock.unlock();
  •                 SetCmdFlag=false;
  •             }
  •             if(isdigit(t)){
  •                 cmd.push_back(t);
  •             }
  •         }
  •         Sleep(10);
  •     }
  •     //
  •     if(Jumpflag)
  •     {
  •         int leftTime=TLE- ( clock() - StartTime );
  •         if(leftTime>0)
  •         {
  •             for(int i=4;i>=0;--i)
  •             {
  •                 for(int j=99;j>=0;j-=1)
  •                 {
  •                     int dt=(double)leftTime*( exp( (i+j/100.0)/2.5)-1 )/(exp(2.0)-1);
  •                     update(dt);
  •                     Sleep(8);
  •                 }
  •             }
  •         }
  •     }
  •     //Ending!
  •     task = async(procFlicker,"00:00:00",100000);
  •     while(1){
  •         taskStatus = task.wait_for(std::chrono::milliseconds(0));
  •         if(taskStatus == future_status::ready){
  •             task.get();
  •             break;
  •         }
  •         if(checkKeyDown(VK_ESCAPE)){
  •             EndOfProc.lock();
  •             task.get();
  •             EndOfProc.unlock();
  •             break;
  •         }
  •         Sleep(100);
  •     }
  •    
  •     update(0,"00:00:00");
  •     for(int i=0;i<300;++i){
  •         Blur(GetImageBuffer());
  •         FlushBatchDraw();
  •         Sleep(25);
  •     }
  •     EndBatchDraw();
  •     closegraph();

  •     return 0;
  • }






  • 回復

    使用道具 檢舉

    該用戶從未簽到

    4

    主題

    28

    帖子

    221

    積分

    超級版主

    TFcis 104級 公關

    Rank: 8Rank: 8

    積分
    221

    台南一中資訊社

    發表於 2014-6-23 23:11:55 | 顯示全部樓層
    話說我最近點餅乾蠻需要的......
    回復 支持 反對

    使用道具 檢舉

    您需要登錄後才可以回帖 登入 | 加入我們

    本版積分規則

    快速回覆 返回頂部 返回列表