Bài viết này, chúng tôi sẽ giới thiệu đến bạn cách sử dụng lớp Timer. Khi bạn muốn ứng dụng của bạn thực hiện việc gì đó một cách tuần hoàn thì Timer là lựa chọn hàng đầu cho bạn.
Timer được áp dụng rất nhiều trong các điều khiển của Form và trong việc phát triển ứng dụng nhận và truyền dữ liệu từ xa.
Chẳn hạn như trong điều khiển MessageBox. Khi bạn khởi tạo một mesagebox thì sẽ có tham số “timeout = 0″. Nếu bạn không thay đổi giá trị mặc định đó hoặc thiết lập giá trị =0 thì không có vấn đề gì. Nhưng giá trị đó khác 0 thì một bộ đếm thời gian sẽ được khởi tạo. Sau khoảng thời gian timeout đó, bộ đếm thời gian sẽ phát ra sự kiện “hết thời hạn”. Và messagebox sẽ tự động đóng lại.
Hoặc khi bạn lập trình socket, việc nhận các dữ liệu từ socket là việc làm thường xuyên và có định kỳ, nếu ta sử dụng vòng lặp vô hạn để vào socket lấy dữ liệu thì ứng dụng của bạn sẽ không thể làm thêm việc gì khác. Sử dụng Timer đưa bạn đến với việc lập trình thread – ứng dụng của bạn có thể làm (độc lập) nhiều việc cùng một thời điểm.
Bài này, chúng tôi sẽ giới thiệu đến bạn, làm thế nào để sử dụng lớp Timer trong ứng dụng của bạn. Ví dụ đơn giản, bạn muốn ứng dụng của bạn hiển thị lên Giờ/ Phút/ Giây hiện tại, tương tự như đồng điện tử trên máy tính vậy. Lúc này, bạn sẽ nghĩ đến việc lấy ngày giờ của hệ thống. Sau đó, là hiển thị chúng lên một Label là xong. Vấn đề lớn là khi nào mình sẽ tiếp tục việc lấy giờ hệ thống rồi hiển thị lên màn hình. Rõ ràng công việc đó sẽ được tuần hoàn lặp lại sau thời gian 1 giây.
Ví dụ: kết quả sẽ hiển thị như sau:
Các bước cơ bản khi sử dụng lớp Timer như sau:
1. Tạo một thể hiện của lớp Timer
Timer* pTimer = new Timer;
2. Khởi tọa thể hiện với một đối tượng biết lắng nghe sự kiện
pTimer->Construct(*pTimerEventListener);
3. Định thời gian mà Timer sẽ bị vô hiệu – nghĩa là lượng thời gian mà vòng tuần hoàn sẽ lặp lại
pTimer->Start(1000); //The timer fires in 1000 milliseconds
4. Xử lý sự kiện “hết thời hạn” của một chu kỳ và bắt đầu một chu kỳ mới
void OnTimerExpired(Timer& timer) // Timer event handler.
{
// Do something useful.
timer.Start(1000);// Reset the timer.
}
Bây giờ bạn áp dụng kiến thức trên để tạo ra đồng hồ điện tử, tương tự như hình trên nha.
a. Bạn tạo ra tập tin “TimerForm.h” với nội dung như sau:
/*
* TimerForm.h
*
* Created on: May 19, 2010
* Author: AWK
*/
#ifndef TIMERFORM_H_
#define TIMERFORM_H_
#include
#include
#include
#include
class TimerForm :
public Osp::Ui::Controls::Form,
public Osp::Base::Runtime::ITimerEventListener
{
public:
TimerForm(void);
bool Initialize(void);
virtual ~TimerForm(void);
protected:
Osp::Ui::Controls::Label* pLabel;
Osp::Base::Runtime::Timer* pTimer;
public:
virtual result OnInitializing(void);
void OnTimerExpired(Osp::Base::Runtime::Timer& timer);
};
#endif /* TIMERFORM_H_ */
b. Tiếp đến, bạn tạo ra tâp tin “TimerForm.cpp” với nội dung như sau:
/*
* TimerForm.cpp
*
* Created on: May 19, 2010
* Author: AWK
*/
#include "TimerForm.h"
using namespace Osp::Base;
using namespace Osp::Base::Runtime;
using namespace Osp::Ui;
using namespace Osp::Ui::Controls;
using namespace Osp::Graphics;
using namespace Osp::System;
TimerForm::TimerForm(void)
{}
TimerForm::~TimerForm(void)
{}
bool
TimerForm::Initialize(void)
{
result r = E_SUCCESS;
r = Form::Construct(FORM_STYLE_NORMAL|FORM_STYLE_TITLE);
SetName(L"TimerForm");
SetTitleText(L"Timer Form");
Color *c = new Color(0x1051ce);
SetBackgroundColor(*c);
return true;
}
result
TimerForm::OnInitializing(void)
{
result r = E_SUCCESS;
// Add Label Control
pLabel = new Label();
pLabel->Construct(Rectangle(30, 300, 420, 60), L"TIME");
pLabel->SetTextHorizontalAlignment(ALIGNMENT_CENTER);
// Add a Label to the Form
AddControl(*pLabel);
//Timer
pTimer = new Timer;
pTimer->Construct(*this);
pTimer->Start(1000);
return r;
}
void
TimerForm::OnTimerExpired(Timer& timer)
{
DateTime today;
SystemTime::GetCurrentTime(UTC_TIME, today);
String str;
int h = today.GetHour();
int m = today.GetMinute();
int s = today.GetSecond();
str = "Time: ";
str += (h>=10?Integer::ToString(h):"0"+Integer::ToString(h));
str += ":" + (m>=10?Integer::ToString(m):"0"+Integer::ToString(m));
str += ":" + (s>=10?Integer::ToString(s):"0"+Integer::ToString(s));
pLabel->SetText(str);
pLabel->Draw();
pLabel->Show();
timer.Start(1000);// Reset the timer.
}
Chúc bạn thành công!


Xin chào! Bạn có thể góp ý cho tôi 1 chút dc ko? khi tôi using namespace là Osp::System thì khi biuld bị báo lỗi là System not a namespace. Mong dc giúp đỡ
chao ban minh cung vua moi nghien cuu ve bada va cung co vuong mac nhu ban, sau 1 hoi doc bada help thi minh phat hien ra la o “TimerForm.h” minh can them #include la chay duoc ngon lanh, mong la su tim hieu cua minh giup ich duoc cho ban. Than ^^