打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
delphi匿名线程中调用TThread类方法与属性
 Pascal Code 
1
2
3
4
5
6
7
8
9
10
11
12
procedure TMainForm.Button1Click(Sender: TObject);
begin
  TThread.CreateAnonymousThread(procedure
     begin
       Synchronize(procedure
         begin
          Edit1.Text := 'aa';
         end
       );
     end
   ).Start;
end;

在这个环境中,作为 CreateAnonymousThread 参数的匿名函数所形成的闭包(Closure)所处于的上下文环境是 TMainForm.Button1Click。也就是说,闭包能访问外部域是 TMainForm.Button1Click 所能访问的域。你企图访问的 Synchronize 是 TThead.Synchronize,不论是类方法还是对象方法,都不处于 TMainForm.Button1Click 能访问的作用域。碰巧你这个闭包中访问 Self 是合法的,但它是 TMainForm 的实例调用 TMainForm 的实例的 Self,不是 TThread 的实例的 Self。
 
所以现在要做的就是解决访问域的问题。
 
解决方案1:
 Pascal Code 
1
2
3
4
5
6
7
8
9
10
11
procedure TMainForm.Button1Click(Sender: TObject);
var
  t: TThread;
begin
  t := TThread.CreateAnonymousThread(procedure
     begin
       ...
     end
    );
  t.Start;
end;
这样,闭包的上下文环境中包换了局部变量 t,可以通过它来完成对 TThread 实例的 Synchronize 方法的访问。但是现在还有一个问题,TThread.Synchronize 方法是 protected,TMainForm 所在的单元不是 Classes,无法直接访问。这时候只要简单利用同一单元内可以访问 protected 的特性即可:
 Pascal Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
type
  TThreadPlus = class(TThread);

...

procedure TMainForm.Button1Click(Sender: TObject);
var
  t: TThread;
begin
  t := TThread.CreateAnonymousThread(procedure
     begin
       TThreadPlus(t).Synchronize(procedure
         begin
          Edit1.Text := 'aa';
         end
      end
    );
  t.Start;
end;
解决方案2:利用了TThead类的Class function处于Pulic的特性,免除了新类的声明 
 Pascal Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TMainForm.Button1Click(Sender: TObject); 
var t: TThread; 
begin 
  t:= TThread.CreateAnonymousThread(procedure 
   begin 
        TThread.Synchronize(t,
           procedure 
             begin 
               Caption := 'aa';
             end ); 
   end);
  t.Start;
end;
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
现在, Delphi 的多线程已经非常易用了!
Delphi+多线程
delphi多线程
AutoUpgrader组件NoUpdateAvailable提示技巧
delphi多线程编程
一个值得大家来考虑的dll问题
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服