Khái niệm
Trong lập trình phần mềm, Debouncing là một kỹ thuật lập trình được sử dụng để giới hạn số lần một hàm được thực thi. Nó đảm bảo rằng một hàm chỉ được gọi một lần sau một khoảng thời gian nhất định, ngay cả khi nó được gọi liên tục trong khoảng thời gian ngắn.
Debouncing thường được sử dụng trong các trường hợp như:
- Tìm kiếm: Khi người dùng nhập vào ô tìm kiếm, debouncing giúp đảm bảo rằng một cuộc gọi API chỉ được thực hiện sau khi người dùng ngừng nhập trong một khoảng thời gian ngắn.
- Sự kiện scroll: Debouncing giúp giảm số lần thực thi hàm khi người dùng scroll trang web.
- Sự kiện click: Debouncing giúp ngăn chặn việc gọi hàm nhiều lần khi người dùng click vào nút.
Lợi ích của debouncing:
- Cải thiện hiệu suất: Giảm số lượng cuộc gọi API không cần thiết, qua đó cải thiện hiệu suất của ứng dụng.
- Giảm tải cho máy chủ: Giảm tải cho máy chủ bằng cách ngăn chặn các yêu cầu quá mức.
- Tăng cường trải nghiệm người dùng: Tạo ra một trải nghiệm mượt mà hơn cho người dùng.
Debouncing là một kỹ thuật giúp trì hoãn việc thực thi một hàm trong một khoảng thời gian nhất định, thường được sử dụng để giảm số lượng cuộc gọi API không cần thiết và cải thiện hiệu suất của ứng dụng.
Debouncing cũng có thể áp dụng trong lập trình nhúng. Khi xử lý tín hiệu từ nút nhấn của thiết bị hay ngắt, debounce có thể áp dụng để lọc bỏ tín hiệu nhiễu không cần thiết.
Cách thực hiện Debouncing
Để thực hiện debouncing, bạn có thể sử dụng một hàm debounce nhận vào hai tham số:
- fn: Hàm được thực thi sau khi thời gian chờ kết thúc
- ms: Khoảng thời gian chờ
Hàm debounce sẽ trả về một hàm mới, hàm này sẽ được gọi khi muốn thực thi fn. Nếu hàm được gọi nhiều lần trong khoảng thời gian ms, thì chỉ có lần gọi cuối cùng, sau khi thỏa khoảng thời gian chờ, sẽ được thực thi.
Cách thực hiện hàm debounce bằng C:
#define DEBOUNCE_TIME 1000
typedef struct {
void (*func)(void);
time_t last_call_time;
} debounce_t;
void debounce(debounce_t *debounce_info) {
time_t current_time = time(NULL);
if (current_time - debounce_info->last_call_time >= DEBOUNCE_TIME / 1000) {
debounce_info->func();
debounce_info->last_call_time = current_time;
}
}CDưới đây là một ví dụ về cách thực hiện debounce trong ngôn ngữ C. Ở đây xài vòng lặp vô tận để mô phỏng việc gọi liên tục hàm debounce.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#define DEBOUNCE_TIME 1000 // Debounce time in millisecond
// Structure to store information of debounce function
typedef struct {
void (*func)(void);
time_t last_call_time;
} debounce_t;
// Debounce function
void debounce(debounce_t *debounce_info) {
time_t current_time = time(NULL);
if (current_time - debounce_info->last_call_time >= DEBOUNCE_TIME / 1000) {
debounce_info->func();
debounce_info->last_call_time = current_time;
}
}
// Calling function after debouncing
void my_function() {
printf("This function is called after debouncing.\n");
}
int main() {
debounce_t debounce_info;
debounce_info.func = my_function;
debounce_info.last_call_time = time(NULL) - DEBOUNCE_TIME / 1000 - 1; // Initialize the last call time
while (1) {
// Demonstrate calling debounce function in many times
printf("Call debounce function.\n");
debounce(&debounce_info);
sleep(0.5); // Wait for 0.5 seconds before calling again
}
return 0;
}CTuy nhiên, ví dụ trên không thực sự chính xác vì nó sử dụng time(NULL) để đo thời gian, mà chỉ có độ chính xác đến từng giây. Để có độ chính xác cao hơn, bạn có thể sử dụng các hàm như gettimeofday() hoặc clock_gettime() để đo thời gian.
Dưới đây là một ví dụ sử dụng gettimeofday().
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>
#define DEBOUNCE_TIME 1000 // debounce time in millisecond
// Structure to store information of debounce function
typedef struct {
void (*func)(void);
struct timeval last_call_time;
} debounce_t;
// Debounce function
void debounce(debounce_t *debounce_info) {
struct timeval current_time;
gettimeofday(current_time, NULL);
long elapsed_time = (current_time.tv_sec - debounce_info->last_call_time.tv_sec) * 1000 +
(current_time.tv_usec - debounce_info->last_call_time.tv_usec) / 1000;
if (elapsed_time >= DEBOUNCE_TIME) {
debounce_info->func();
debounce_info->last_call_time = current_time;
}
}
// This function is called after debouncing
void my_function() {
printf("This function is called after debouncing.\n");
}
int main() {
debounce_t debounce_info;
debounce_info.func = my_function;
gettimeofday(&debounce_info.last_call_time, NULL);
debounce_info.last_call_time.tv_sec -= 2; // Initialize the last call time
while (1) {
// Demonstrate calling debounce function in many times
printf("Call debounce function.\n");
debounce(&debounce_info);
usleep(500000); // Wait for 0.5 seconds before calling again
}
return 0;
}CTrong ví dụ này, gettimeofday() được sử dụng để đo thời gian với độ chính xác đến micro giây.
Tham khảo
Mọi bài viết, hình ảnh, hay nội dung khác đăng trên talucgiahoang.com đều thuộc bản quyền của trang. Vui lòng chỉ sử dụng hoặc đăng lại nội dung vì mục đích phi thương mại, và cần ghi lại tiêu đề gốc, đường link URL, cũng như dẫn nguồn talucgiahoang.com.