我正在尝试执行以下操作:
- 发送长执行请求(我在这里使用
Events.echoEvent
) - 使用“取消”按钮显示模式对话框(等待...)
- 如果用户按下“取消”,对话框将被隐藏并且不应执行事件方法。
- 如果用户不按下按钮并等待。事件方法被调用并关闭等待对话框
我怎样才能做到这一点?
ZK 通常在单个线程中为服务器上的单个请求完成所有工作。Events.echoEvent
让您通过完成请求,然后立即在一个全新的请求(和线程)中回调服务器来解决这个问题。用户与客户端的交互会触发一个新请求,因此这也将是一个新线程。
因此,在上面的示例中,您将使用三个线程:
echoEvent
echoEvent
显然,当最后两个被调用时,第一个将早已不复存在,但这是您需要考虑的问题才能解决您的问题。
你会在 StackOverflow 上找到很多关于让两个线程进行交互的讨论,或者更具体地说,让一个线程中断另一个线程。
我将向您推荐“如何在 Java 中停止线程?” 接受的答案倾向于共享某种“停止标志”而不是直接调用interrupt
线程。
在您的场景中,这将在长时间运行的过程中发挥作用,同时定期检查停止标志(一个简单的boolean
)。当用户单击“取消”时,您只需将标志翻转为true
.
你可以试试
创建一个线程来做上面提到的Sean的长操作(这是一个独立的线程,不是ZK请求线程)
创建一个计时器以定期检查该线程的状态。(这将创建一个 javascript 计时器以在客户端定期发送 ajax 请求)
并通过 ZK 客户端编程自定义忙掩码,添加取消按钮。(按钮单击执行另一个 ajax 请求)
请参考 stackoverflow 上的类似文章: Override “Processing” in ZK
编辑:
在我的博客中有一些相关的文章: