消抖算法防止多次触发

消抖算法 消抖算法(Debouncing Algorithm)是一种常用于软件开发中的技术,用于处理频繁触发的事件或信号。其主要目的是防止因输入设备的机械开关引起的电气浮动或者软件中的逻辑波动导致的多

消抖算法

消抖算法(Debouncing Algorithm)是一种常用于软件开发中的技术,用于处理频繁触发的事件或信号。其主要目的是防止因输入设备的机械开关引起的电气浮动或者软件中的逻辑波动导致的多次触发问题。

在实际应用中,消抖算法通常用于处理按钮点击、键盘输入或者其他类似的事件。具体而言,消抖算法通过设定一个时间阈值,在该时间内如果事件再次发生,那么会被视为同一次事件的触发,而不是多次独立触发。

#include #include #include enum class ButtonState {
    Idle,
    Pressed,
    Debouncing
};

class Button {
private:
    ButtonState state;
    std::chrono::steady\_clock::time\_point last\_change\_time;
    std::chrono::steady\_clock::duration debounce\_duration;

public:
    Button(std::chrono::steady\_clock::duration duration)
        : state(ButtonState::Idle), debounce\_duration(duration) {}

    void press() {
        auto now = std::chrono::steady\_clock::now();
        switch (state) {
        case ButtonState::Idle:
            state = ButtonState::Pressed;
            last\_change\_time = now;
            break;
        case ButtonState::Pressed:
            if (now - last\_change\_time > debounce\_duration) {
                state = ButtonState::Debouncing;
                last\_change\_time = now;
            }
            break;
        case ButtonState::Debouncing:
            // Do nothing while debouncing
            break;
        }
    }

    bool shouldTrigger() {
        auto now = std::chrono::steady\_clock::now();
        if (state == ButtonState::Debouncing && now - last\_change\_time > debounce\_duration) {
            state = ButtonState::Idle;
            return true;
        }
        return false;
    }
};

int main() {
    Button button(std::chrono::milliseconds(500)); // 设置防抖时间为500ms

    // 模拟按钮按下事件
    for (int i = 0; i < 10; ++i) {
        std::this\_thread::sleep\_for(std::chrono::milliseconds(200)); // 模拟200ms内可能的多次按下

        button.press();

        if (button.shouldTrigger()) {
            std::cout << "Button pressed!" << std::endl;
            // 在这里可以执行按钮触发后的逻辑
        }
    }

    return 0;
}