13

我有个问题。我有一个使用线程的 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;
4

2 回答 2

12

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

于 2011-06-15T08:06:01.040 回答
1

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

在我的开发 PC 上,互联网连接测试成功......而且速度如此之快,我从未发现问题!挣扎了几个小时后,我终于找到了这个帖子,并通过断开我的网线来重现它。

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

于 2017-07-20T13:20:29.440 回答