如何在Haskell中逐步更新GUI,并在用户事件中断计算?

如何在Haskell中逐步更新GUI,并在用户事件中断计算?,haskell,concurrency,ghc,cancellation,Haskell,Concurrency,Ghc,Cancellation,我正在考虑写一个类似Qt的程序。在该示例中,GUI/辅助线程分离是在后台线程上执行计算的情况下建立的。随着迭代地提供更多细节,图像数据被发送回GUI窗口以供显示。如果鼠标在仍在进行计算时平移或缩放…旧计算将“取消”,不再运行 (注释:在C++中,没有办法安全地杀死一个运行线程)。因此,工作者必须在计算循环中的点……中以一种协作的多任务方式检查代码布尔。 作为Haskell的新人,我想知道,即使是一个非常简单的版本,一个人会有什么样的求助方式。我读过,这对我来说(有些)有意义。但我还没有发现任何关

我正在考虑写一个类似Qt的程序。在该示例中,GUI/辅助线程分离是在后台线程上执行计算的情况下建立的。随着迭代地提供更多细节,图像数据被发送回GUI窗口以供显示。如果鼠标在仍在进行计算时平移或缩放…旧计算将“取消”,不再运行

<>(注释:在C++中,没有办法安全地杀死一个运行线程)。因此,工作者必须在计算循环中的点……中以一种协作的多任务方式检查代码<重启< /COD>布尔。 作为Haskell的新人,我想知道,即使是一个非常简单的版本,一个人会有什么样的求助方式。我读过,这对我来说(有些)有意义。但我还没有发现任何关于要求进行长时间计算、从计算中逐步获得结果,然后根据用户开始新计算时所做的事情,从计算中拉出地毯的方法

这是我在搜索中发现的,我不确定它的相关性:


GHC并发中的killThread是否具有其他系统不具备的安全性;是否可以取消此表格?被终止的计算不会涉及GUI操作——它们的工作都将由GHC控制。但他们仍然需要一种方式,以某种方式逐步将他们的进度反馈给接口。因此,在发出信号的过程中,它可能正在使用某些操作系统设施,这是一个“不安全的时间”。是,也不是。
killThread
是GHC是一种超级奇特的设置方式,可以
重新启动
布尔值。GHC运行时中的每个“功能”都有一个异步异常插槽,运行时会不时检查该插槽,如果该插槽不为空,将在该功能中引发异常

通常情况下,这将杀死该线程,尽管我相信可以捕获异常并从中恢复。此外,当异步异常在线程中被屏蔽时,该插槽不会被检查;屏蔽结束后,将检查插槽并引发异常。无论它是一个轻量级线程(通过
forkIO
启动)还是一个完整的操作系统线程(通过
forkOS
启动),都是如此
forkProcess
是它自己的怪兽,尽管我在IRC上听说它比文档中描述的更安全


在仅限Haskell的程序中,您将与IORef、MVar或TVar(不同级别的功能和安全)进行通信。(大多数)这些引用上的公开操作屏蔽了小窗口的异步异常,因此这些引用不会处于“坏”状态。如果您需要以其他方式进行通信,您将负责正确屏蔽/取消屏蔽异步异常,以避免通信通道中断(并最小化“不间断”窗口)。

您希望在后台与UI线程同时运行计算。如果背景计算可以返回部分结果,那么你也可以在它们出现时更新它们。对于这样的问题,我绝对建议使用FRP。您可以手动使用STM通道、锁、MVARS等来实现这一点,但是您的代码将非常必要,因为您可以在C++中编写代码。FRP将让您担心计算以及何时将信号发送到何处,而不是如何使其并发。也就是说,我想说您应该有两种事件类型,一种用于计算线程接收的用户输入,另一种用于返回部分或完成的计算,以供GUI线程处理;我会在阅读时牢记这一点(首先要熟悉很多基础知识,但我想根据我对这种模式的程序的兴趣来指导我所看的内容)。我很想看到Mandelbrot程序的“最佳实践”Haskell版本,它具有类似的中断能力…无论是用我不知道的FRP技巧还是killThread完成的。。。