【问题标题】:What's the use of the new Delphi TActivityIndicator when it runs in the main thread?新的 Delphi TActivityIndi​​cator 在主线程中运行时有什么用?
【发布时间】:2015-11-08 22:30:42
【问题描述】:

我希望在打开大型查询时使用新的西雅图 TActivityIndi​​cator,但这会阻塞主 vcl 线程并因此停止 TActivityIndi​​cator。

TActivityIndi​​cator 肯定表示活动,应该在不同的线程中工作。

不必在任何地方都放入 Application.Processmessages,还有其他方法吗?

【问题讨论】:

  • 指标应该在主线程中工作,而您的任务应该在工作线程中完成。
  • 所以我重新设计了我的应用程序以适应活动指示器?我宁愿希望反过来。
  • 那是不现实的。当您将长时间运行的任务放在 UI 线程上时,您犯了错误。再多的魔法也无法掩盖这个错误。你必须修复它。将长时间运行的任务交给工作人员。哦,永远不要调用 ProcessMessages。
  • 我们的期望并不低。这就是 VCL 的设计方式。 VCL 在这里不是异常值。鉴于 Win32 的设计,VCL 的线程规则是良好设计的标志。最初的设计师做得很好。
  • 我并没有说你的应用程序是“垃圾”。你似乎有些激动。不可避免的事实是,您不应该在 UI 线程上执行长时间运行的任务。这是一个众所周知且长期存在的规则。这几乎是线程存在的理由。

标签: multithreading delphi delphi-10-seattle


【解决方案1】:

新的 VCL UI 活动指示器是一个进度指示器,旨在反映 Windows 10 的外观。它与任何其他 VCL 控件一样,受通常的 VCL 线程规则的约束。对控件的所有访问都必须来自 UI 线程。

因此,您需要从 UI 线程创建并显示指示器。您需要确保 UI 线程从未被阻塞。这意味着必须将任何长时间运行的任务发送到工作线程,以免它们阻塞 UI 线程。

加上ça change,加上 c'est la meme 选择。

【讨论】:

    【解决方案2】:

    UI 只能从主线程更新。活动指示器也必须遵守该规则。而是将您的活动放在不同的线程中。然后您的应用程序将保持响应。

    【讨论】:

    • 谢谢塞巴斯蒂安。然而,我希望阻止应用程序并让用户等待查询,同时欣赏漂亮的旋转点而不深入研究线程
    • 您可以在工作线程运行时禁用 UI 并显示活动指示器,然后在工作线程完成时停止指示器并解锁 UI。这样,用户仍然需要等待,但它可以让 UI 线程在工作线程忙时保持响应处理来自操作系统的 UI 消息。
    • 从线程你也可以在主窗体/线程中更新一些东西。 Synchronize( procedure begin .......... end );
    猜你喜欢
    • 2016-09-23
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2023-03-05
    • 1970-01-01
    • 2015-08-16
    相关资源
    最近更新 更多