Timer

Post date: Nov 28, 2013 1:02:13 AM

از این پست به بعد، وبلاگ از نو شروع می‌شود. اول بازنویسی پست‌های قبلی را که مربوط به ++C هستند شروع می‌کنم.

این برنامه‌ای است که ساعت کامپیوتر را نشان می‌دهد. البته شاید با برنامه‌های ساده تری هم بشود این کار را کرد، اما این برنامه از تابع‌های API که مخصوص برنامه نویسی ویندوز هستند استفاده می‌کند. تابع‌های API امکانات بیش تری دارند و به آن چیزی که در ویندوز می‌گذرد نزدیک ترند. برنامه را خوب بررسی کنید. در کلاس Time امکاناتی هست که اصلا به کار برده نشده است. کلاسی به اسم Timer را می‌شود با استفاده از کلاس Time نوشت که مثل زمان سنج عمل کند.

این متن برنامه که در کامپایلر رایگان Visual C++ 2010 Express اجرا می‌شود:

#include <string>

#include <windows.h>

#include <conio.h>

#include <iostream>

using namespace std;

class Time

{
public:

SYSTEMTIME local_time;

unsigned long long time;

unsigned long long num(FILETIME ft)

{

ULARGE_INTEGER ui;

ui.LowPart = ft.dwLowDateTime;

ui.HighPart = ft.dwHighDateTime;

return ui.QuadPart;

}

//--------------------------------------------

FILETIME FT(unsigned long long ull)

{

FILETIME ret;

ULARGE_INTEGER ui;

ui.QuadPart = ull;

ret.dwLowDateTime = ui.LowPart;

ret.dwHighDateTime = ui.HighPart;

return ret;

}

//--------------------------------------------

SYSTEMTIME Decompose(unsigned long long tm)

{

FILETIME ft = FT(tm);

SYSTEMTIME ret;

FileTimeToSystemTime(&ft,&ret);

return ret;

}

//--------------------------------------------

void SetTime(unsigned long long tm)

{

this -> time = tm;

local_time = Decompose(tm);

}

//--------------------------------------------

public:

void UpdateTime()

{

FILETIME ft;

GetLocalTime(&local_time);

SystemTimeToFileTime(&local_time,&ft);

SetTime(num(ft));

}

//--------------------------------------------

int Milli()

{

return local_time.wMilliseconds;

}

int Sec()

{

return local_time.wSecond;

}

int Min()

{

return local_time.wMinute;

}

int Hour()

{

return local_time.wHour;

}

int Day()

{

return local_time.wDay;

}

int Month()

{

return local_time.wMonth;

}

int Year()

{

return local_time.wYear;

}

//--------------------------------------------

void AddTime(int hour, int min ,int sec = 0, int milli = 0)

{

unsigned long long millis =

milli +

1000 * sec +

1000 * 60 * min +

1000 * 60 * 60 * hour;

SetTime( time + 10000 * millis );

}

void AddDay(int day)

{

unsigned long long millis =

1000 * 60 * 60 * 24 * day;

SetTime( time + 10000 * millis );

}

//--------------------------------------------

unsigned long long TotalMilli()

{

return time / 10000;

}

unsigned long long TotalSec()

{

return TotalMilli() / 1000;

}

unsigned long long TotalMin()

{

return TotalSec() / 60;

}

unsigned long long TotalHour()

{

return TotalMin() / 60;

}

unsigned long long TotalDay()

{

return TotalHour() / 24;

}

//--------------------------------------------

wstring GetString()

{

wstring ret;

wchar_t a[10];

_itow(Month(),a,10);

ret += a;

ret += L"/";

_itow(Day(),a,10);

ret += a;

ret += L"/";

_itow(Year(),a,10);

ret += a;

ret += L" ";

_itow(Hour(),a,10);

ret += a;

ret += L":";

_itow(Min(),a,10);

ret += a;

ret += L":";

_itow(Sec(),a,10);

ret += a;

ret += L".";

_itow(Milli(),a,10);

ret += a;

return ret;

}

//--------------------------------------------

Time operator + (Time Tm)

{

Time ret(0);

ret.SetTime(this -> time + Tm.time);

returnهم بشه این ret;

}

Time operator - (Time Tm)

{

Time ret(0);

ret.SetTime(this -> time - Tm.time);

return ret;

}

Time& operator = (unsigned long long tm)

{

SetTime(tm);

return *this;

}

Time& operator = (const Time& tm)

{

SetTime(tm.time);

return *this;

}

void operator += (Time Tm)

{

*this = *this + Tm;

}

void operator -= (Time Tm)

{

*this = *this - Tm;

}

//--------------------------------------------

Time()

{

UpdateTime();

}

Time(unsigned long long time)

{

SetTime(time);

}

Time(int hour, int min, int sec = 0, int milli = 0)

{

SetTime(0);

AddTime(hour,min,sec,milli);

}

};

int main()

{

Time T;

for(int i = 0; i < 150; i++)

{

Sleep(100);

T.UpdateTime();

wstring str = T.GetString();

wcout<< L"\r" << str;

}

_getch();

}

Output:

6/13/2010 2:41:59.537