首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在主应用程序繁忙时避免线程冻结

如何在主应用程序繁忙时避免线程冻结
EN

Stack Overflow用户
提问于 2009-11-13 21:34:13
回答 3查看 5K关注 0票数 1

我有点小问题。我想要显示一个进度窗体,当主应用程序执行繁重的操作时,它只在上显示动画。

我在一个线程中做了这件事,当用户没有执行任何操作时,它工作得很好。但它只是在我的主应用程序繁忙时停止。

我不能将Application.ProcessMessages放在不同的代码行之间,因为我使用的是处理时间很长的3rdparty组件。

我的想法是创建一个新的进程,并在该进程中创建一个执行动画的线程。现在,当主应用程序执行繁重的操作时,这不会停止线程的执行。

但在我看来,只有在执行新程序的情况下,才能创建新进程。

有没有人有办法让一个线程即使在主应用程序繁忙时也能继续执行?

/Brian

EN

回答 3

Stack Overflow用户

发布于 2009-11-13 21:43:06

如果辅助线程的优先级不低于主线程,则不使用Synchronize()方法,不调用SendMessage(),也不尝试获取主GUI线程已经获取的任何同步对象,那么辅助线程应该继续工作。

由于VCL不是线程安全的,人们经常建议使用Synchronize()来执行代码,以便在VCL线程的上下文中同步更新VCL控件。但是,如果VCL线程本身很忙,这将不起作用。辅助线程将阻塞,直到主线程继续处理消息。

无论如何,您的应用程序设计是不幸的。您应该在工作线程中执行所有冗长的操作,并保持主线程对用户交互的响应。即使有了花哨的动画,你的应用程序也会对用户显示为挂起,因为它不会在VCL线程忙于做其他事情时重绘,也不会处理任何消息。尝试将冗长的代码放在工作线程中,并在主线程中的计时器事件中执行动画。

票数 9
EN

Stack Overflow用户

发布于 2009-11-13 21:43:31

你的逻辑是倒退的。你的线程应该做“繁重的工作”,并将消息传递给你的主应用程序以更新进度或动画。

如果你把所有“繁重的工作”留在你的主应用程序中,另一个线程将没有足够的机会执行,这意味着它将没有机会更新任何东西。此外,对GUI (VCL控件)的所有访问都必须发生在应用程序的主线程中;VCL不是线程安全的。(当涉及到可视控件时,Windows本身也不是。)

票数 7
EN

Stack Overflow用户

发布于 2009-11-13 21:45:24

如果被问到“有没有人有办法让一个线程即使在主应用程序忙的时候也能继续执行?”您的意思是主线程很忙,您应该将正在消耗主线程的代码移到另一个线程。换句话说,主线程应该负责启动和停止操作,而不是执行它们。Disclaymer:事实上,我不知道delphy,但我认为/希望这些概念非常类似于C++或C#。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1729224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档