【问题标题】:Delphi Thread freezeDelphi 线程冻结
【发布时间】:2013-12-03 22:42:57
【问题描述】:

我编写了一个有两个线程的服务应用程序。 第一个线程,显示带有标签的表单。 第二个线程,查询 ADO。

第一个线程总是被沙漏光标冻结,没有标签标题。

请帮忙。

【问题讨论】:

  • 一项服务没有业务显示任何窗口。如果右旋钮被旋转(允许与桌面交互),它可能在较旧的 Windows 版本中工作,但在 Vista MS 开始主动阻止它工作。
  • 欢迎来到 Stack Overflow,茶。看起来有人对您的问题投了反对票,因为它写得不好。为了将来参考,如果您添加一个代码示例来帮助我们了解您正在尝试做什么,这真的很有帮助。不过,看起来你从 Mghie 和 Allen 那里得到了很好、有用的答案。

标签: delphi multithreading freeze


【解决方案1】:

如果你试图在一个不是主线程的线程中显示一个表单,那么你会遇到这样奇怪的事情。其中最值得注意的是,如果表单和标签是在非主线程中创建的,那么您就没有消息循环来处理消息。如果表单是在主线程中创建的,但您试图从非主线程中显示它,那么由于 Windows 处理消息和线程的方式,它很可能是死锁。

创建窗口句柄时,它与创建它的线程相关联。这意味着 Windows 将确保发送到该句柄的任何消息都在该线程上进行处理。

我强烈建议您阅读窗口消息、消息队列和句柄如何在多线程环境中交互和运行。如果没有正确完成,您肯定会遇到一些非常奇怪且可能无法预测的行为。

【讨论】:

  • 看起来这个人会受益于一本巨书,就像 Marco Cantu 的 800 多页德尔福巨著之一。
【解决方案2】:

我会将您的情况称为 Race、Deadlock 或其他类似的错误。正如艾伦所说,如果后台线程直接访问 VCL 控件,而不使用 TThread.Synchronize(myMethod) 来调用触及 VCL 前台的 myMethod,那么仅此一项就会给您带来麻烦。

请发布更多信息,包括您的代码示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多