gpt4 book ai didi

haskell - wxhaskell异步更新

转载 作者:行者123 更新时间:2023-12-02 16:09:37 25 4
gpt4 key购买 nike

我正在使用 WxHaskell 以图形方式显示使用 TCP 通告状态更新的程序的状态(我使用 Data.Binary 对其进行解码)。当收到更新时,我想更新显示。所以我希望 GUI 能够异步更新其显示。我知道 processExecAsync 异步运行命令行进程,但我认为这不是我想要的。

最佳答案

这是使用事务变量(即软件事务内存)的粗略代码。您可以使用 IORef、MVar 或许多其他构造。

main = do
recvFunc <- initNetwork
cntTV <- newTVarIO 0
forkIO $ threadA recvFunc cntTV
runGUI cntTV 0

上面启动程序,初始化网络和共享变量cntTV

threadA recvCntFromNetwork cntTVar = forever $ do
cnt <- recvCntFromNetwork
atomically (writeTVar cntTVar cnt)

threadA从网络接收数据并将计数器的新值写入共享变量。

runGUI cntTVar currentCnt = do
counter <- initGUI
cnt <- atomically $ do
cnt <- readTVar cntTVar
if (cnt == currentCnt)
then retry
else return cnt
updateGUICounter counter cnt
runGUI cntTVar cnt

runGUI 读取共享变量,如果有更改,将更新 GUI 计数器。仅供引用,在修改 cntTVar 之前,runGUI 线程不会在重试 时唤醒,因此这不是 CPU 占用轮询循环。

在此代码中,我假设您有名为 updateGUICounterinitGUIinitNetwork 的函数。我建议您使用 Hoogle 查找您还不知道的任何其他功能的位置,并了解一些有关每个模块的信息。

关于haskell - wxhaskell异步更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3176682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com