【问题标题】:How to prevent freezing MainForm and wait for return value from sub thread如何防止冻结MainForm并等待子线程的返回值
【发布时间】:2012-07-02 11:01:23
【问题描述】:

我有线程在哪里下载 xml 文件和我想在其他类中解析的这个 xml 文件。现在我有准备线程,我可以在哪里下载它。 在 MainForm 中我使用的是 WaitForSingleObject,但是这个函数冻结了 MainFrom,那么我怎样才能防止 reezing 并等待值呢? 谢谢。

【问题讨论】:

  • 不要在主线程中等待。安排工作线程向主线程发送消息,通知主线程工作已经完成。
  • 您应该为此目的使用 windows 消息,请参阅相关问题stackoverflow.com/questions/4377677/…
  • TThread 类有一个 Synchronize 方法(基于 Windows 消息)用于此目的。

标签: multithreading delphi delphi-7 tthread


【解决方案1】:

首先,使用事件设计线程并使用 Synchronize 调用它们。

在 MainForm 中创建线程并为其分配事件处理程序:

Thread := TMyThread.Create(True);
Thread.OnDownload := DoDownload;
Thread.OnParse := DoParse;
// Other Events
Thread.Start;

您不应该在 MainForm 中等待*。避免使用 Windows 消息方法,因为您的应用程序将失去平台可移植性,只是链接到 WinXX 编译。

【讨论】:

  • 最后我是这样做的,现在当我想通过 MSXML2_TLB 解析 XML 文档时,我陷入了僵局......关键字同步我使用......:/有什么建议吗?死锁始于行 xmldoc := t.DefaultInterface; in t := TDomDocument40.Create(nil); xmldoc := t.DefaultInterface;
【解决方案2】:

在主线程上等待并不是一个很好的设计,但在某些情况下它可能是必要的。但是,在等待期间,您仍然需要处理进入线程的消息。

在 MSDN 上查看 MsgWaitForMultipleObjects

【讨论】:

  • 我同意;我的主要目标是将值(在这种情况下为 xml)返回到 MainForm。我不在乎我是否再使用一个线程来等待... :) 我认为 Boris Treukhlov 的链接可能会有所帮助...
猜你喜欢
  • 1970-01-01
  • 2022-08-20
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
相关资源
最近更新 更多