【问题标题】:How to Interrupt the UI thread如何中断 UI 线程
【发布时间】:2021-12-03 16:29:11
【问题描述】:

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

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

【问题讨论】:

  • 永远不应该有任何东西“在 UI 线程中运行”。 (请参阅下面的 Nathan Hughes 回答。)UI 线程应该只对 事件 做出反应,这些事件可以包括 定时器事件 以及鼠标和键盘以及其他事件。使某些东西“随时间步长迭代”的最简单方法是设置一个周期性计时器,然后在每次计时器触发时推进模型的状态。

标签: multithreading design-patterns


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 2013-12-28
    • 2015-08-14
    • 2014-02-15
    相关资源
    最近更新 更多