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

标签 multithreading delphi delphi-2007

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

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

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

最佳答案

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

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

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

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

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

相关文章:

C++ REST SDK : asynchronous tasks vs. C++11 多线程

Python Tkinter 多线程函数

delphi - 通过互联网与多个客户端使用 firebird 服务器的经验?

delphi - 作为事件处理程序的接口(interface)方法

delphi - 如何以简单安全的方式扩展 TFieldDef?

java - 如何在完成另一个线程后停止一个线程?

java - 调度线程池执行器 : How to priorize Tasks?

database - 如何在 Delphi DBLookupComboBox 中选择正确的项目

delphi - 如何检查包含我使用的 ActiveX 库的 dll 是否使用我的证书签名?

delphi - delphi中名为create的函数的问题