multithreading - 如何中断 UI 线程

标签 multithreading design-patterns

我正在研究一个随着时间步长迭代的模拟模型。有时当模型结果开始向南移动时,我希望能够单击一个按钮来停止迭代。但是,如果我的测试是正确的,当迭代在 UI 线程中运行时,Button.Click 事件不会被激活,因为线程正忙于迭代。那是对的吗?当线程真的很忙时,有没有办法通过单击按钮来中断 UI 线程?

处理此问题的一种方法是使用任务并行库创建一个任务来执行计算量大的迭代。我开始研究这种方法,以防无法中断 UI 线程,但我想我会检查这里以确保我没有错过更简单的方法。

最佳答案

您在 UI 线程上中断计算的想法的问题在于,它需要 UI 线程的配合,而 UI 线程已经在执行您的计算。为了使 UI 线程能够处理您的按钮,单击计算需要停止,以便线程可以返回处理 UI 事件。这意味着保存您的进度,以便您以后可以从中断的地方继续。

这种暂停和恢复似乎比将计算旋转到它自己的线程中更麻烦,它不是完全可以撤销的(JWZ 开发的 Netscape 浏览器就是这样工作的,在一个线程中),但是鼓励使用多线程方法的原因是因为它需要最少的工作,并使您的计算代码最专注于域并且最少被分割。

如果您将计算放在它自己的线程中,那么 UI 线程将响应,操作系统将确保两个线程都运行。您可以定期检查计算是否中断,您可以有一个带有取消按钮的进度条,并且您不必担心停止工作来处理 UI 事件。

我假设有一个 UI,其中有一个负责处理 UI 事件的事件分派(dispatch)线程。这就是 Swing 在 Java 中的工作方式,它是许多 GUI 工具包的流行选择,因为多线程解决方案容易发生死锁(来自用户的事件将以与来自后端的事件不同的顺序获取锁)。您可以为语言和平台指定标签以获得更相关的答案。

关于multithreading - 如何中断 UI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70217636/

相关文章:

javascript - 实现支持 JavaScript 的网站无需 JavaScript 也能运行的技术

sql - 保存分层元素的最佳数据结构/数据库/二进制格式

c# - 在 C# 中,观察者模式不是已经使用事件实现了吗?

c - 我可以在同一进程中通过管道发送指针吗,安全吗?

java - JMeter 为什么添加 Constant Timer 后错误率降低了

multithreading - 在后台线程中限制同时运行带有信号量的异步协程

c++ - 多生产者-消费者执行的效率

java - 架构:在不污染 POJO 的情况下操作模型的最佳实践?并且无需到处重复样板代码

C++ 模板 - 如何跨多个 MTU 使用

multithreading - 非资源僵局?