(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. キー押下イベントまたはキーダウンイベントで他のキーでキーを変更
- 3. 指定された時刻から指定された時刻からMP3ファイルを再生する
- 4. JQuery:キー押下時のイベントのトリガー
- 5. Word Post_Statusを押すと、post_date時刻ではなく特定の時刻に変更されます。
- 6. 指定時刻に起床するスレッド
- 7. キー押下時にアイテムを表示するには
- 8. 指定したタイムゾーンで現在時刻を取得する
- 9. 私がキーを押すまでソケットのAccept()がブロックされる
- 10. Java 8のLocalTimeを使用して、現在時刻が指定時刻よりも60秒前になるまでブロックしますか?
- 11. キー押下が、入力またはテキストエリアにフォーカス
- 12. lwuitでキー押下メソッドをオーバーライドする
- 13. Azureイベントハブスタードは指定された時刻からイベントを受信します
- 14. Pythonで日付と時刻を指定する方法は?
- 15. 指定した日付の時刻をjavacriptで変更します
- 16. PyQt5/Python - 複数のキー押下イベントが1回のキー押下だけで呼び出されます
- 17. カレンダーまたは日付時刻で日付を設定する
- 18. Postgres指定された時刻にトリガーする
- 19. 指定した時刻に石英トリガーを開始する
- 20. 指定された時刻にウェブページをリダイレクトする
- 21. 日付時刻をCで指定した日時形式に変換する
- 22. Java:キー押下時のビープ音を防止する
- 23. キー押下の処理時間を実装する方法
- 24. 指定した開始時刻の時間帯別パンダグループ
- 25. キー押下時の待ち時間が短い音
- 26. java.util.Date/JodaTime:java.util.Dateを指定すると、指定された日付の開始時刻と終了時刻を生成します
- 27. 指定時刻のLaravel Run関数
- 28. トランザクションテーブルのDB2 SQL時刻指定データ
- 29. gSOAP - soap_wsse_add_UsernameTokenDigestの時刻を指定する方法はありますか?
- 30. Altキーを1回押すだけでキー押下を検出する方法
また、長時間スリープ状態にしたい場合は、32ビットシステムのオーバーフローに注意してください。 'threadDelay'はマイクロ秒を指定する' Int'を取るので、32ビットの 'Int'で指定できる最大時間は約2147秒(35分)です。ループ内で複数の 'threadDelay'呼び出しに分割する必要があるかもしれません。 – hammar
@ハマー、ありがとう、良い情報です。私はそれを知らなかった。 –
このループを行う 'Integer - > IO()'型の関数を含むHackage上のライブラリは間違いなくありますが、今見つけられません... –