“锁定”应用程序的 UI 线程是什么意思?

问题描述

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

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

来自fltk-rs docs的锁定功能

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

解决方法

来自FLTK C++ documentation

在多线程程序中,widget 的绘制(在 main() 线程中)与工作线程更新的widget 异步发生,因此在修改widget 时无法安全地进行绘制(并且不应修改任何widget在绘图过程中)。

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

所以你不会长时间锁定用户界面;刚好有足够的时间安全地更新小部件的状态,然后再次解锁。

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

这可能会在同一文档的下一段中解决:

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

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

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

,

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