(1)キーを押すか、または(2)以前に入力した時刻のうちの前の時刻がhh:mm
形式になるまでブロックするにはどうすればよいですか。私は問題がある場合にWindowsを使用しています。これはDOS assembler program(これもWindowsでも動作します)は、Windowsコンソールからbatchman waittil 16:30
のようなものを介して欲しいものですが、私はそれをHaskellで完全にやりたいとします(つまり、はそのプログラムを使用しています。なし)。キー押下または指定時刻までブロックする
0
A
答えて
4
2つのスレッドを開始できます.1つは文字を読み取り、もう1つは指定された時間に達するまで待機します。それらは両方とも、完了を通知するために単一のMVar
に書き込みます。
これはちょっと難しいですが、ほとんどの細部のためです:stdin
をバッファリングされていないエコーモードにして、1つのキーを押すだけで何も印刷せずに待機させてから元の状態に戻したいとします。いずれかの終了後も両方のスレッドを終了させる必要があります。たとえば、タイムアウトが終了すると、stdin
からの読み取りを停止します。さらに、例外が発生した場合、適切にクリーンアップされるようにする必要があります。 bracket
は、ここでクリーンアップロジックを簡素化しますが、それはまだかなり醜いです:
import Prelude hiding (catch)
import Control.Exception
import Control.Concurrent
import System.IO
withRawStdin :: IO a -> IO a
withRawStdin = bracket uncook restore . const
where
uncook = do
oldBuffering <- hGetBuffering stdin
oldEcho <- hGetEcho stdin
hSetBuffering stdin NoBuffering
hSetEcho stdin False
return (oldBuffering, oldEcho)
restore (oldBuffering, oldEcho) = do
hSetBuffering stdin oldBuffering
hSetEcho stdin oldEcho
waitFor :: Int -> IO()
waitFor delay = do
done <- newEmptyMVar
withRawStdin . bracket (start done) cleanUp $ \_ -> takeMVar done
where
start done = do
t1 <- forkIO $ getChar >> putMVar done()
t2 <- forkIO $ threadDelay delay >> putMVar done()
return (t1, t2)
cleanUp (t1, t2) = do
killThread t1
killThread t2
でもすべてのことの後に、この解決策はまだ特定の時間まで待つ処理しません - ちょうどマイクロ秒の一定数を待っています。睡眠時間をマイクロ秒にするには、this previous SO questionが役に立ちます。スリープ時間が十分に長い場合は、マイクロ秒に収まらない場合がありますので、ループでthreadDelay
を使用するか、unbounded-delaysパッケージのdelay
を使用する必要があります。
関連する問題
- 1. キー押下イベントまたはキーダウンイベントで他のキーでキーを変更
- 2. 指定された時刻から指定された時刻からMP3ファイルを再生する
- 3. JQuery:キー押下時のイベントのトリガー
- 4. lwuitでキー押下メソッドをオーバーライドする
- 5. Pythonで日付と時刻を指定する方法は?
- 6. 指定した日付の時刻をjavacriptで変更します
- 7. 指定した時刻に石英トリガーを開始する
- 8. キー押下の処理時間を実装する方法
- 9. Java:キー押下時のビープ音を防止する
- 10. キー押下時の待ち時間が短い音
- 11. java.util.Date/JodaTime:java.util.Dateを指定すると、指定された日付の開始時刻と終了時刻を生成します
- 12. のjQuery ::キー押下とフォーカス
- 13. キー押下イベントを取得
- 14. キー押下でjavascriptを停止する方法(つまりESCキー)
- 15. if文の数字キーの押下を検出しました
- 16. 指定された時刻からビデオフレームを読み込みます。
- 17. キー押下を無効にする
- 18. バーチャルキーボードのキー押下を検出する
- 19. "shift + tab"キー押下イベントをキャプチャする
- 20. 指定された日付までの時間または時刻を表示する方法javascriptまたはphp
- 21. JavaでのNokia Ctrl/Chrキーの押下
- 22. jQueryでキー押下(keydown)をトリガー
- 23. 現在の日の開始時刻と終了時刻を指定します(UTC→EST→UTC)。 Python
- 24. Sql Express 2005:指定された時刻にバックアップを復元
- 25. キャプチャの異なるキー押下
- 26. GtkTreeViewは、キー押下イベントの展開/折りたたみ
- 27. JavaScriptのローカル日付と時刻を指定する方法
- 28. 指定された時刻に最も近いマルチマップの時刻にイテレータを返す
- 29. 天気予報:指定された時刻に指定された場所にある情報のダイレクトリンク
- 30. 指定された時間のキーの保持をシミュレートします
また、長時間スリープ状態にしたい場合は、32ビットシステムのオーバーフローに注意してください。 'threadDelay'はマイクロ秒を指定する' Int'を取るので、32ビットの 'Int'で指定できる最大時間は約2147秒(35分)です。ループ内で複数の 'threadDelay'呼び出しに分割する必要があるかもしれません。 – hammar
@ハマー、ありがとう、良い情報です。私はそれを知らなかった。 –
このループを行う 'Integer - > IO()'型の関数を含むHackage上のライブラリは間違いなくありますが、今見つけられません... –