BỘ ĐỊNH THỜI GIAN trong LẬP TRÌNH C TRÊN WINDOWS

Như bọn họ đã biết Windows cung cấp cho ta những thông tin thông qua dạng thông điệp như là thông điệp bàn phím, thông điệp tạo nên từ thiết bị chuột . Và hình như thì một thông điệp cũng rất hữu dụng là thông điệp thời gian. Khi viết một chương trình họ có thể yêu cầu hệ điều hành gởi một thông điệp cảnh báo theo từng khoảng thời gian nhất định để bọn họ có thể làm cho một số xử lý cần thiết. Thông điệp này được gởi từ hệ điều hành đến chương trình trải qua một bộ định thời gian (Timer) và thông điệp được tạo nên là WM_TIMER. Việc cần sử dụng chức năng này rất đơn giản, ta khai báo một bộ định thời gian với thiết lập thông số khoảng thời gian để Windows gây ra thông điệp Timer mang lại ứng dụng. Khi đó ứng dụng chỉ cần xử lý thông điệp WM_TIMER vào hàm xử lý cửa sổ WinProc.

Bạn đang xem: Cách dùng hàm timer trong c#


Bộ định thời gian cùng vấn đề đồng bộ

Theo lý thuyết thông điệp thời gian do Windows cung cấp là đúng mực đến mili giây nhưng thực tế không trọn vẹn như vậy. Sự đúng chuẩn còn phụ thuộc vào đồng hồ của hệ thống và các hoạt động hiện thời của chương trình. Tại sao của vấn đề là thông điệp thời gian WM_TIMER gồm độ ưu tiên thấp, như thông điệp đánh vẽ lại screen WM_PAINT, thông thường chúng phải chờ cho xử lý kết thúc các thông điệp khác.

Xem thêm: Máy Cưa Lọng Bàn Cũ Giá Rẻ, Uy Tín, Chất Lượng Nhất, Máy Cưa Bàn Cũ Giá Rẻ Chất Lượng, Giá Tốt 2021

 


Khởi tạo bộ định thời gian

Không như thông điệp xuất phát từ keyboard và chuột, được Windows gởi tự động vào hàng đợi thông điệp của ứng dụng. Đối với thông điệp thời gian phải được khai báo trước bằng hàm SetTimer, sau thời điểm khai báo hàm này thì Windows sẽ gởi thông điệp WM_TIMER điều đặn vào hàng đợi của ứng dụng.

Hàm SetTimer được khai báo như sau :

UINT_PTR SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc );

Trong đó ý nghĩa những tham số được mô tả:

hWnd : Định danh của cửa sổ khai báo cần sử dụng bộ định thời gian. NIDEvent : Định danh của bộ định thời gian. NElapse : Là khoảng thời gian nghỉ giữa nhị lần gởi thông điệp lpTimerFunc : Hàm sẽ xử lý lúc thông điệp WM_TIMER phát sinh, nếu bọn họ khai báo là NULL thì Windows sẽ gởi thông điệp WM_TIMER vào sản phẩm đợi thông điệp của cửa sổ tương ứng.

Khi không hề dùng bộ định thời gian nữa tốt kết thúc ứng dụng ta gọi hàm KillTimer, hàm này được khai báo :

BOOL KillTimer( HWND hWnd, UINT_PTR uIDEvent );

hWnd : Định danh của cửa sổ cần sử dụng bộ định thời gian uIDEvent : Định danh của bộ định thời gian.

Ví dụ về bộ định thời gian


Dùng thông điệp WM_TIMER

Đoạn chương trình minh họa việc sử dụng bộ định thời gian trong chương trình. Cứ mỗi 0.5 giây thì chương trình gây ra tự động ngẫu nhiên một vòng tròn bên trên màn hình.

#include

#include "stdio.h"

#define MAX_POINT 10000

#define IDT_TIMER1 1

LRESULTCALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

PAINTSTRUCT ps;

HDC hdc;

static int NumCir = 0;

static POINT point < MAX_POINT >;

int r = 5, i;

HPEN pen, oldPen;

RECT rc;

TCHAR str <255>;

/* Xử lý thông điệp*/

switch ( message )

{

case WM_CREATE:

/* Khai báo dùng bộ định thời gian trong ứng dụng*/

SetTimer(hWnd, IDT_TIMER1, 500, ( TIMERPROC )NULL);

/* Khởi động hàm ngẫu nhiên*/

srand ( (unsigned) time( NULL ) );

break;

case WM_PAINT:

hdc = BeginPaint ( hWnd, &ps );

pen = CreatePen ( PS_SOLID, 2, RGB (255,0,0) );

oldPen = (HPEN) SelectObject ( hdc, pen );

/* Vẽ các vòng tròn với trung ương là những điểm lưu vào point và bán kính là r */

for( i=0; i

#include "stdio.h"

#define IDT_TIMER1 1

LRESULTCALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

PAINTSTRUCT ps;

HDC hdc;

/* Khai báo biến lưu những giá trị không gian*/

struct tm *newtime;

time_t CurTime;

TCHAR str <255>;

RECT rc;

/* Biến LOGFONT để tạo fonts mới*/

LOGFONT lf;

HFONT oldFont, font;

COLORREF color = RGB (255, 0, 0), oldColor;

switch ( message )

DT_VCENTER

return 0;

/* Hàm xử lý của Timer*/

VOID CALLBACK TimerProc( HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)

{

/* Hàm này đơn giản yêu cầu đánh lại vùng có tác dụng việc*/