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

我正在考虑编写像Qt的
Mandelbrot Sample这样的程序.在该示例中,建立GUI /工作线程分离,在后台线程上执行计算.随着迭代地提供更多细节,图像数据被发送回GUI窗口以供显示.如果鼠标在正在进行的计算仍在进行时进行平移或缩放…旧的计算被“取消”并且不再运行.

(注意:没有办法安全地在C中杀死一个正在运行的线程.所以工作人员必须在计算循环中的点期间一次又一次地检查重启布尔值…以协作式多任务方式.)

作为一个新到Haskell的人,我想知道究竟是什么样的追索权,即使是一个非常简单的版本.我读过关于Functional Reactive Programming的内容,这对我来说是有道理的.但是我没有找到任何关于要求长时间计算的信息,随着时间的推移从计算中得到渐进的结果,然后根据用户做的事情开始一个新的计算结果.

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

How to write Ctrl-C handler in Haskell?

GHC的并发性中的killThread是否具有其他系统不具备的安全性;是否可以用于取消此表格?被杀死的计算将不涉及GUI操作 – 他们的工作将全部是GHC控制的地方.但他们仍然需要一种方法以某种方式逐步将他们的进展传回界面.所以在那个信令期间它可能正在使用一些操作系统设施并且是一个“不安全的时间”.

最佳答案 是的,不. killThread是GHC是一种设置重启boolean的超级花哨方式. GHC运行时中的每个“功能”都有一个异步异常的插槽,运行时不时检查,如果它不为空,则会在该功能中抛出异常.

通常情况下,这会杀死该线程,但我相信异常可以被捕获并从中恢复.此外,虽然在线程中屏蔽了异步异常,但不检查此插槽;一旦屏蔽结束,就检查插槽并抛出异常.无论它只是一个轻量级线程(通过forkIO启动)还是一个完整的OS线程(通过forkOS启动)都是如此. forkProcess是它自己的野兽,虽然我在IRC上听说它比文档更安全.

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

点赞