【问题标题】:Possible causes of "EOSError 1400 - Invalid window handle"“EOSError 1400 - 无效的窗口句柄”的可能原因
【发布时间】:2011-06-15 06:30:26
【问题描述】:

我有问题。 我有一个使用线程的 VCL 应用程序。该线程进行一些计算并通过 Synchronize() 调用 MainForm 的方法。一切正常,我有一个“开始”按钮,用于创建和运行线程,还有一个“停止”按钮,用于停止和释放它。没有错误,什么都没有。

但由于某种原因,当我关闭应用程序并我已经运行了线程时,我得到了EOSError 1400 - Invalid window handle。我已经为 OnClose 程序设置了断点,我唯一要做的就是保存一个 ini 文件,这没有错误,当我进一步跟踪(使用 F7)时,在“调用”之后,我到达了最后(Application.Run; end.end. 我得到了错误,所以没有特定的代码行引发它。

我希望这个问题有点清楚,我希望它可以解决,因为只是忽略错误似乎有点不干净。

感谢inb4


回答

当调用线程的 Execute 方法时,我发生了这个错误,它看起来像这样:

procedure TRunThread.Execute;
var (...)
begin
  while not Terminated do begin
    (...)
    MainForm.Memo1.Lines.Add('Some text'); // Even though this call worked fine during
    //the application running, it caused errors on shutting the app down.
    // For acccessing GUI elements, it's necessary to use Synchronize()
    (...)
  end;
end;

【问题讨论】:

  • 您确定您的线程此时不再运行(“在 Application.run 的最后”)?
  • 为什么要投反对票?这是一个善良而有效的问题。我投票赞成以弥补反对票。这些不合理的反对票最近似乎失控了:-/
  • 可能因为无法回答原始问题而被否决。即使添加了一些代码,仍然无法回答。如果问题不清楚,他们应该被否决,这就是我理解的网站的运作方式。
  • @David:我同意,但如果 OP 尽力描述情况,恕我直言,最好向他索取更多信息。此外,没有评论的反对票永远不会有帮助。
  • 天哪。请原谅所有这些大惊小怪,在格式化 .Execute 方法发布时,我注意到有一个直接(未同步)调用 MainForm.Memo1.Lines.Add(); 。出于某种原因,我将它与另一个命令放在同一行。该死的我。对不起,谢谢。将其注释掉后,不再出现错误。

标签: multithreading delphi eoserror


【解决方案1】:

一个可能的原因是线程对 GUI 的一些不同步访问。你说线程不这样做,但是没有看到TRunThread.Execute 源代码,看起来像是最好的猜测。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,错误代码 5 Access is denied。这与开始在嵌入式面板上测试互联网连接的线程有关(使用BeginThread)。如果用户在显示表单后立即退出表单(正在测试互联网连接),则会发生 AV。

    在我的开发 PC 上,互联网连接测试成功......而且速度如此之快,我从未发现问题!苦苦挣扎了几个小时,终于追到这个贴子,拔网线重现了。

    解决方案很简单:退出表单时(例如在FormDestroy 事件中)确保线程在继续之前绝对没有运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 2013-09-07
      • 2014-08-02
      • 1970-01-01
      相关资源
      最近更新 更多