【问题标题】:What does it mean to "lock" an app's UI thread?“锁定”应用程序的 UI 线程是什么意思?
【发布时间】:2021-01-28 20:45:46
【问题描述】:

我正在使用flkt-rs crate 来设计一个 GUI。我想知道“锁定”我的应用程序的 UI 线程意味着什么。这是否意味着没有 CPU 分配给该线程?为什么要锁定 UI 线程?那么什么时候想解锁呢?

此外,我看到fltk::app::lock() 函数返回一个结果,这意味着使用它可能存在一些问题。什么会阻止您成功锁定 UI 线程?

来自fltk-rs docs的锁定功能:

pub fn lock() -> Result<(), FltkError>

【问题讨论】:

  • 我猜您可能正在对某些数据进行非原子操作,并且不希望 UI 在其处于不一致状态时访问它。
  • 查看 crate 中的错误类型,其中一种可能是FailedToLock。我不知道为什么会发生这种情况,但大概会发生。

标签: multithreading rust fltk


【解决方案1】:

来自FLTK C++ documentation

在多线程程序中,小部件的绘制(在main() 线程中)与工作线程正在更新的小部件异步发生,因此在修改小部件时不能安全地进行绘制(并且在绘制时不应修改任何小部件正在进行中)。

FLTK 支持在内部使用锁定机制的多线程应用程序。这允许工作线程锁定渲染上下文,防止任何绘图发生,同时更改其小部件的值。

因此您不会长时间锁定 UI;刚好有足够的时间安全地更新小部件的状态,然后再次解锁。

什么会阻止您成功锁定 UI 线程?

同一文档中的下一段可能会解决此问题:

要在库中加入锁定机制,FLTK 必须在配置过程中使用–enable-threads 进行编译。如果可能,基于 IDE 的 FLTK 版本会自动编译并结合锁定机制。从 1.3 版本开始,构建 FLTK 库的配置脚本也默认设置了 --enable-threads。

如果应用程序被编译为单线程,那么锁定主线程将永久锁定整个应用程序。它没有明确说明,但在这种情况下出现FailedToLock 错误似乎是合理的。

这种 API 感觉不是很“生锈”,很可能是这样的,因为 fltk-rs crate 是 C++ 库的薄包装。

【讨论】:

    【解决方案2】:

    该函数已公开,因为在处理 xthreads(x11 线程)时可能需要它。否则你不应该需要它。一般来说Fl::lock是递归锁,可以多次调用而不会死锁。在内部,所有小部件在修改之前调用锁,然后调用 Fl::unlock。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-21
      • 2015-04-07
      • 1970-01-01
      • 2015-06-02
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多