【发布时间】: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