我可以勾选以确认我没有从主线程外触摸VCL?

时间:2015-02-03 16:06:58

标签: multithreading delphi vcl

我是线程编程的新手。 (在XE7中)

我很紧张,我可能无意中调用了从线程访问VCL的程序。我的理解是这很危险。

我已经将下面的代码添加到了一些触及VCL的程序中。

(*$IFDEF DEBUG *)
    Assert((Windows.GetCurrentThreadId = System.MainThreadID), "Thread error");
(*$ENDIF *)

希望这能够捕获我在线程中对VCL访问过程所做的任何调用。

我想到,如果我可以将此代码插入到某些VCL低级代码中,那么从线程中捕获非法VCL访问会更有效。

我从来没有挖过VCL代码,所以我要求反馈。 VCL代码中是否有一些中心位置可以作为此代码的好地方?

TComponent.Create是一个很好的低级别的地方,但我不关心正在创建的控件。我更关心访问属性(.Left,.Checked)等。

TIA

1 个答案:

答案 0 :(得分:0)

这不可能。

在这个方向上有一点是System.Rtti中的TVirtualMethodInterceptor。您可以使用它来挂钩某些常见类的所有虚拟方法,如TControl或TCheckbox。像SetChecked或SetBounds这样的东西是作为虚方法实现的。所以你可能能够挂钩这些。但是你仍然必须代理这些类的每个实例。 请查看Delphi帮助中的示例。