2

私は今とても混乱しています。

私がやりたいのは、2つのコマンドを待機するリスナー関数を作成することです。つまり、200ミリ秒ごとにリッスンし、ユーザーからの他の入力を無視する必要があります。

function foo() {

    read -sN1 _input

    case "${_input}" in

        A) echo 'Option A';;
        B) echo 'Option B';;
    esac
}

while true; do
    sleep 0.2
    foo
done

Aキー(またはUPキー)を10回「ハンマーで叩く」と、「オプションA」を10回(ただしゆっくりと)書き込みます。これは、最大で3回だけ書き込む時間しかなかったはずです。それはなぜですか?そしてどうすれば修正できますか?

4

3 に答える 3

3

端末は、プログラムへの入力をバッファリングします。プログラムがスリープ中に受け取った入力を無視するようにするには、を呼び出す前に入力バッファをクリアする必要がありますread。私の知る限り、これをbashで行う方法はありません。

于 2012-08-17T13:24:26.950 に答える
0

stdinが閉じているブロック内にスリープ関数を配置できます。

  {
    sleep 0.2
  } <&- 

または、スリープ直後にstdinバッファをクリア(読み取りおよび破棄)することもできます。

sleep 0.2
read -t 1 -n 10000 discard
于 2012-08-17T13:27:24.090 に答える
0

これは私が思いついたものです。あまり良くありませんが、機能します。

function inputCommand() {

    _now=`date +%s%N | cut -b1-13`
    _time=$(($_now-$_timeout))

    if [ $_time -gt 500 ]; then
            $1
            _timeout=`date +%s%N | cut -b1-13`
    fi
}

function keyPressUp() {

    echo "Key Press Up"
}

function waitForInput() {

    unset _input
    read -sN1 _input

    case "${_input}" in

            A) inputCommand "keyPressUp";;
    esac
}

while true; do

        waitForInput
done
于 2012-08-17T13:42:31.147 に答える