多线程UI api是什么样子的,它提供了什么优势?

多线程UI api是什么样子的,它提供了什么优势?,api,user-interface,language-agnostic,Api,User Interface,Language Agnostic,或者,等价地,您将如何设计这样一个API。预期/示例用法也将是说明性的 我的好奇心直接来自于这篇文章的评论(以及随后的编辑)。过去的类似情况为实际提问提供了一些启发 执行摘要: 我觉得多线程UI api不可能以有意义的方式实现,也不是特别需要。这种观点似乎有点争议,作为一个(相对)谦逊的人,我希望看到我的方式的错误,如果它们确实是错误的 *在这个上下文中,多线程的定义非常松散,但是它对您来说是有意义的 因为这是一个非常自由的形式,我会接受任何一个答案,在我看来,这个答案是最连贯和最有支持的;不

或者,等价地,您将如何设计这样一个API。预期/示例用法也将是说明性的

我的好奇心直接来自于这篇文章的评论(以及随后的编辑)。过去的类似情况为实际提问提供了一些启发

执行摘要:
我觉得多线程UI api不可能以有意义的方式实现,也不是特别需要。这种观点似乎有点争议,作为一个(相对)谦逊的人,我希望看到我的方式的错误,如果它们确实是错误的

*在这个上下文中,多线程的定义非常松散,但是它对您来说是有意义的


因为这是一个非常自由的形式,我会接受任何一个答案,在我看来,这个答案是最连贯和最有支持的;不管我是否同意

接受回答


**好的,也许需要更多的澄清

几乎每个严肃的应用程序都有不止一个线程。至少,他们会启动一个额外的线程来执行一些后台任务,以响应UI事件

<强>我不认为这是多线程UI。< /强>

所有的UI工作仍在单线程上完成。我想说,在基本层面上,多线程UI api必须(以某种方式)消除UI对象的基于线程的所有权或将事件分派给单个线程


记住,这是关于UI api本身的;不是使用它的应用程序。

我看不出多线程UI API与现有UI API有多大区别。主要区别在于:

  • (如果使用非GC语言,如C++)对象生命周期由引用计数指针包装器(如std::tr1::shared_ptr)跟踪。这可以确保您不会与试图删除对象的线程竞争
  • 所有方法都是可重入的、线程安全的,并保证不会阻塞事件回调(因此,在持有锁时不应调用事件回调)
  • 需要指定锁的总订单;例如,控件上方法的实现只允许调用子控件上的方法,除非安排异步回调稍后运行或在另一个线程上运行
通过这两个更改,您可以将其应用于几乎任何您喜欢的GUI框架。其实不需要大规模的改变;但是,额外的锁定开销会降低速度,并且对锁顺序的限制会使定制控件的设计变得更加复杂


因为这通常比它的价值要麻烦得多,所以大多数GUI框架都采取了中间立场;UI对象通常只能从UI线程进行操作(某些系统,如win32,允许多个UI线程具有单独的UI对象),为了在线程之间进行通信,有一种线程安全方法来安排在UI线程上调用回调。

大多数GUI都是多线程的,至少在某种意义上,GUI是在与应用程序其余部分不同的线程中运行的,并且通常是一个事件处理程序的多个线程。这有一个明显的好处,即复杂的后端工作和同步IO不会使GUI突然停止,反之亦然

增加更多的线程往往是一个收益递减的命题,除非你在处理诸如多点触摸或多用户之类的事情。然而,大多数多点触摸输入似乎是在驱动程序级别进行线程化处理的,因此通常不需要在GUI级别进行处理。在大多数情况下,您只需要1:1的线程与用户比率加上一些常数,具体取决于您正在做什么

例如,预缓存线程很流行。线程可以在执行预测缓存时消耗任何额外的CPU周期,以使事情总体上运行得更快。动画线程。。。如果您有密集的动画,但希望保持响应能力,则可以将动画放在比UI其余部分优先级更低的线程中。如上所述,事件处理程序线程也很流行,但通常对框架的用户是透明的


因此线程肯定有用途,但是为GUI生成大量线程是没有意义的。但是,如果您正在编写自己的GUI框架,您肯定必须使用线程模型来实现它。

多线程ui应用程序没有任何问题,也没有特别之处。您所需要的只是线程之间的某种同步,以及一种跨线程边界更新ui的方法(在C#中启动InVoke,在普通Win32应用程序中发送消息,等等)

至于使用,你看到的几乎所有东西都是多线程的,从Internet浏览器(它们有后台线程下载文件,而主线程负责显示下载的部分——同样,使用大量同步)到Office应用程序(想到Microsoft Office中的保存功能)到游戏(祝你好运找到一个单线程的大牌游戏)。事实上,C#WinForms UI为UI生成了一个新线程,即开箱即用


你具体认为什么是不可取的或难以实现的?

我真的看不到任何好处。假设平均应用程序有3个主要目标:

  • 渲染
  • 用户输入/事件处理程序
  • 数字处理/网络/磁盘/等
  • 将这些线程分别划分为一个线程(对于#3有几个线程)将非常符合逻辑,我将调用#1和#2 UI

    你可以说#1已经是多线程的,并且在GPU上有成吨的着色器处理器。我不知道在CPU上添加更多线程是否真的有用。(至少如果你使用标准着色器,IIRC一些软件光线跟踪器和其他CGI渲染器使用多个线程-但我会将这些应用程序放在#3)下)

    用户输入方法#2应该非常短,并调用#3中的内容