gpt4 book ai didi

multithreading - 从 OnTimer 事件访问父窗体中的变量 - 获取异常

转载 作者:行者123 更新时间:2023-12-03 18:04:06 25 4
gpt4 key购买 nike

我在 OnTimer 事件处理程序 (TTimer) 中遇到异常,该异常在执行时会增加父表单中的整数变量。计时器需要能够访问用作 id 的递增整数。

我的第一个问题是:如何在 Delphi 2007 中判断哪个代码在哪个线程中运行?有没有一种方法可以在 Debug模式下对此进行检查,以便我可以确定?

其次,如果我需要从另一个线程访问和修改父表单中的变量,最好的方法是什么?似乎有时 Delphi 允许我“错误地”访问这些变量而没有给出异常,而其他时候它确实给出了异常。

最佳答案

可以肯定的是:一方面你在谈论计时器事件,另一方面在谈论多线程。这是两种完全不同的并行运行代码的方式。

计时器将始终在主线程中运行。在那里访问在主线程中创建和使用的所有内容应该是安全的。事实上,定时器事件只能在没有其他主线程代码运行时发生,因为它需要应用程序的消息处理程序来处理定时器消息。因此,它要么在任何事件处理代码之外,要么在您的事件处理程序之一调用 Application.ProcessMessages 时发生。

线程与此大不相同。在这种情况下,不同线程中的代码彼此独立运行。如果在多处理器机器(或多核)上运行,它们甚至有可能真正并行运行。这种方式可能会遇到很多问题,特别是 Delphi VCL(包括 Delphi XE)不是线程保存的,因此对任何 VCL 类的调用只能从主线程完成(有一些异常(exception)这条规则)。

因此,在期待任何有用的答案之前,请先澄清您是在谈论计时器还是真正的多线程。

关于multithreading - 从 OnTimer 事件访问父窗体中的变量 - 获取异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/499737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com