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

问题描述

| 我有个问题。 我有一个使用线程的VCL应用程序。该线程进行一些计算,并通过Synchronize()调用MainForm的方法。一切正常,我有一个““开始”按钮,它创建并运行该线程,还有一个“停止”按钮,该按钮停止并释放它。没有错误,没有。 但是由于某种原因,当我关闭应用程序并运行线程时,我得到一个“ 0”。我已经断点了OnClose过程,唯一要做的就是保存一个ini文件,这没有错误,当我进一步跟踪(使用F7)时,在调用“ \”后到达最后(to1ѭ)。 “
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;
    

解决方法

        可能的原因是从线程对GUI的某些不同步访问。您说该线程没有执行此操作,但是没有看到看上去最好的
TRunThread.Execute
源代码。     ,        我遇到了同样的问题,错误代码5
Access is denied
。事实证明,这与一个线程开始测试嵌入式面板上的Internet连接(使用
BeginThread
)有关。如果用户在显示表单后立即退出表单(正在测试Internet连接),则会出现AV。 在我的开发PC上,互联网连接测试成功了……而且如此之快,我从未发现过问题!经过几个小时的努力,我终于找到了这个线程,并通过断开网络电缆来复制它。 解决方案很简单:退出表单时(例如在
FormDestroy
事件中),请确保在继续执行之前线程肯定未运行。