阻止直到按下按键或一天中的给定时间

2023-12-23

如何阻止直到 (1) 按键或 (2) 之前输入的一天中的时间(以较早者为准)hh:mm格式已达到。我正在使用 Windows,以防万一。这DOS汇编程序 http://www.robvanderwoude.com/downloads/batchman.zip(它也可以在Windows上运行)通过类似的东西做我想要的batchman waittil 16:30从 Windows 控制台,但我想完全在 Haskell 中完成,(即without使用该程序)。


可以启动两个线程:一个读取字符,另一个等待指定时间;他们都写一个MVar http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Concurrent-MVar.html发出完成信号。

这有点棘手,但主要是由于细节:我们想要stdin在无缓冲和无回显模式下,单击一次按键即可停止等待而不打印任何内容,然后恢复原始状态;并且我们还需要在任一线程完成后终止两个线程,这样我们就可以停止读取stdin一旦超时到期。此外,如果发生异常,我们需要确保正确清理。bracket http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Exception.html#v: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

即使在这之后,这个解决方案仍然无法处理等待直到特定时间的问题——只是等待一定数量的微秒。为了将一天中的某个时间转化为几微秒的睡眠时间,之前的这个问题 https://stackoverflow.com/questions/8575118/sleeping-until-the-start-of-the-next-minute可能有帮助。如果睡眠时间足够长,那么它们可能不适合Int微秒,所以你可能必须使用threadDelay在一个循环中,或者delay http://hackage.haskell.org/packages/archive/unbounded-delays/latest/doc/html/Control-Concurrent-Thread-Delay.html来自无限延迟 http://hackage.haskell.org/package/unbounded-delays包裹。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

阻止直到按下按键或一天中的给定时间 的相关文章

随机推荐

  • 垃圾收集应该已删除对象,但 WeakReference.IsAlive 仍返回 true

    我有一个我希望通过的测试 但垃圾收集器的行为并不像我想象的那样 Test public void WeakReferenceTest2 var obj new object var wRef new WeakReference obj wR
  • tm 使用示例

    你能举个使用的例子吗tm 我不知道如何初始化struct 当前日期以此格式写入y m d 如何使用tm结构 call time 获取当前日期 时间 自 1970 年 1 月 1 日以来的秒数 call localtime to get st
  • .NET Core:从 API JSON 响应中删除空字段

    在 NET Core 1 0 所有 API 响应 的全局级别上 如何配置 Startup cs 以便在 JSON 响应中删除 忽略空字段 使用 Newtonsoft Json 您可以将以下属性应用于属性 但我想避免将其添加到每个属性 Jso
  • 将文件保存到 Azure Blob 中

    我正在使用下面的 python 代码将文件保存到本地文件夹中 我想将此文件直接保存到 Azure Blob 中 我不希望文件存储在本地然后上传到 blob 我尝试在文件夹变量中给出 blob 位置 但它不起作用 我有一个 excel 文件
  • 如何使用 Webpack 设置 React 组件的私有共享库

    我在多个 Webpack 项目中使用了许多 React 组件 我想通过 NPM 共享它们 所以我很自然地 将这些组件放入 私有 GitHub 存储库中 将该存储库添加到主项目中package json 为了能够同时在组件库上进行开发 我使用
  • HTML 下载和文本提取

    下载 URL 列表并仅提取文本内容的好工具或工具集是什么 不需要蜘蛛 但可以控制下载文件名 并且线程将是一个额外的好处 平台是linux wget http linux die net man 1 wget html2ascii http
  • 创建 CA 证书的 x.509 V3 扩展基本约束和密钥用法有什么区别?

    这两个动作似乎做了同样的事情 使用基本约束X 509 证书中的扩展名以表明它是 CA 证书 并且 使用按键用法扩展名例如表示公钥可用于证书签名 这些扩展有什么区别 它们是否有相同的目的或相辅相成 密钥用法 定义了可以使用证书中包含的密钥执行
  • Postgres pg_dump 缓存查找索引失败

    我正在尝试使用以下命令创建 postgres 数据库的备份 省略详细信息 pg dump h host p 5432 U user db gt db sql 一段时间后 我收到错误 已格式化 pg dump archiver db quer
  • 启动期间生成的 ELF 可执行文件段错误

    我正在生成一个 ELF 可执行文件 并将 text 部分加载到 LOAD 段中 它可以很好地拆卸 但尝试在下面运行它gdb gives During startup program terminated with signal SIGSEG
  • 如何在CSS中设置超细“font-weight”(小于100)?

    我想让文字超细 小于 font weight 100 这可以用 CSS 来做吗 Like this but with helvetica 处理 Web 字体时 CSS 字体粗细不会 使字体变细 或加粗 对于未从 url 加载的字体font
  • XML 序列化问题 - 如何序列化一个对象中的元素、属性和文本

    我是使用 NET 进行 XML 序列化的新手 在使用它一段时间后 我现在感到很困惑 我可以序列化具有包含其他元素的属性的元素 但如何序列化类似的内容
  • lodash:使用不同的对象数组过滤对象数组

    这个问题具体针对lodash https lodash com docs 给定两个对象数组 什么是best way用另一个数组的对象过滤一个数组 我试图提出下面的一个场景 我这样做的方法是使用两个 forEach循环 但我想知道使用 lod
  • 在 C# 中根据引用的 XSD 验证 XML

    我有一个具有指定架构位置的 XML 文件 如下所示 xsi schemaLocation someurl localSchemaPath xsd 我想用 C 进行验证 当我打开文件时 Visual Studio 会根据架构验证它并完美列出错
  • SAM 无需重建即可运行

    我已经开始使用AWS SAM for python 在本地测试我的功能时 我运行 sam build use container sam local start api You can now browse to the above end
  • 支持词法范围 ScriptBlock 参数(例如Where-Object)

    考虑以下任意函数和测试用例 Function Foo MyBar Param Parameter Mandatory false ScriptBlock Filter if Filter Filter true Filter Filter
  • 默认 MaxPoolingOp 仅在使用从 GPU 移植的训练模型时在设备类型 CPU 错误上支持 NHWC

    我使用 python keras 和 tensorflow 在 PC 上开发并训练了一个模型 并使用 GPU 运行预测等 一切正常 然后 我将模型和预测代码转移到笔记本电脑上 并使用requirements txt重建环境 将gpu包交换为
  • 在 Servlet 中使用 Bean

    我有一个 jsp 页面 index jsp 其中包含两个文本字段用户名和密码的表单
  • 我如何学习设计这样的用户界面?

    我最近在使用该应用程序Secret https www secret ly 并正在观察它拥有的令人惊叹的用户界面 如果您正在打开 Secret 的网页 请向下滚动一点以查看 UI 作为一个Android新手 想学习的人 我想问一下这个UI是
  • 如何使用 PagingAndSortingRepository 不返回特定列

    我知道标题可能听起来有点令人困惑 但我不知道如何在标题上总结我的问题 我的主要问题是我不想使用 PagingAndSortingRepository 返回特定列 想象一下以下场景 我有两个实体 一个称为 用户 Entity Table na
  • 阻止直到按下按键或一天中的给定时间

    如何阻止直到 1 按键或 2 之前输入的一天中的时间 以较早者为准 hh mm格式已达到 我正在使用 Windows 以防万一 这DOS汇编程序 http www robvanderwoude com downloads batchman