“EOSError 1400 - 窗口句柄无效”的可能原因

时间:2011-06-15 06:30:26

标签: multithreading delphi eoserror

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

但是由于某些原因,当我关闭应用程序并且我已经运行了线程时,我得到了EOSError 1400 - Invalid window handle。我已经打破了OnClose程序,我唯一能做的就是保存一个ini文件,没有错误,当我进一步追踪时(使用F7),我到达最后(Application.Run; end.),之后“调用“end.我收到错误,因此没有特定的代码行提升它。

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

谢谢inb4


ANSWER

当调用线程的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;

2 个答案:

答案 0 :(得分:12)

可能的原因是从线程中对GUI进行了一些非同步访问。你说线程没有这么做,但是没有看到看起来最好的TRunThread.Execute源代码。

答案 1 :(得分:0)

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

在我的开发PC上,互联网连接测试成功了...而且我从未见过这么快!经过几个小时的挣扎之后,我终于将它追踪到这个线程并通过断开我的网络线缆来重现它。

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