线程的变量问题,请教大侠!
发布日期:2021-11-10 09:01:18 浏览次数:2 分类:技术文章

本文共 2323 字,大约阅读时间需要 7 分钟。

主进程中有一个panel对象,创建一个进程thread.create(panel),传入panel对象,然后在进程thread中修改panel的一些属性,但是窗体上panel并没有发生相应的改变,不知道是什么原因,请高手指点!    
   
  谢谢!

注明:如果同样的代码,写在主进程中就完全可以,但写在线程中就不起作用。

{   Important:   Methods   and   properties   of   objects   in   visual   components   can   only   be  

      used   in   a   method   called   using   Synchronize,   for   example,  
   
              Synchronize(UpdateCaption);  
   
      and   UpdateCaption   could   look   like,  
   
          procedure   qaw.UpdateCaption;  
          begin  
              Form1.Caption   :=   'Updated   in   a   thread';  
          end;   }  
 

注意和VCL的同步

unit   Unit1;  

   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   ExtCtrls,   StdCtrls;  
   
  type  
      TForm1   =   class(TForm)  
          Button1:   TButton;  
          Panel1:   TPanel;  
          procedure   Button1Click(Sender:   TObject);  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
      twudi=class(TThread)  
          private  
              Fpanel   :   TPanel;  
              fs   :   string;  
              procedure   SetPC;  
          protected  
                procedure   Execute;   override;  
          public  
              constructor   Create(pn   :   TPanel);  
      end;  
   
  var  
      Form1:   TForm1;  
   
  implementation  
   
  {$R   *.dfm}  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
          twudi.Create(Panel1);  
  end;  
   
  {   twudi   }  
   
  constructor   twudi.Create(pn:   TPanel);  
  begin  
        Fpanel   :=   pn;  
    //     FreeOnTerminate   :=   true;  
   
        inherited   Create(false);  
  end;  
   
  procedure   twudi.Execute;  
  var  
    i   :   integer;  
  begin  
        Fpanel.Align   :=   alLeft;  
        for   i   :=   0   to   10000   do  
        begin  
            fs   :=   IntToStr(i);  
            Synchronize(SetPC);  
        end;  
  end;  
   
  procedure   twudi.SetPC;  
  begin  
          Fpanel.Caption   :=   fs;  
  end;  
   
  end.  
 

在同步的时候,建议不要用Synchronize,   因为Synchronize回暂停现在的线程。建议用消息传递同步信息。

一个用消息的例子:  

   
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   ExtCtrls,   StdCtrls;  
   
   
  type  
      TForm1   =   class(TForm)  
          Button1:   TButton;  
          Panel1:   TPanel;  
          Edit1:   TEdit;  
          procedure   Button1Click(Sender:   TObject);  
      private  
   
      public  
          {   Public   declarations   }  
      end;  
      twudi=class(TThread)  
          private  
              Fedit   :   TEdit;  
          protected  
                procedure   Execute;   override;  
        public  
          constructor   Create(ed   :   TEdit);  
      end;  
   
  var  
      Form1:   TForm1;  
   
  implementation  
   
  {$R   *.dfm}  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
          twudi.Create(Edit1);  
  end;  
   
  {   twudi   }  
   
  constructor   twudi.Create(ed:   TEdit);  
  begin  
        Fedit   :=   ed;  
        inherited   create(False);  
  end;  
   
  procedure   twudi.Execute;  
  var  
    i   :   integer;  
  begin  
      FreeOnTerminate   :=   true;  
        for   i   :=   0   to   10000   do  
            SendMessage(Fedit.Handle,WM_SETTEXT,0,integer(pchar(inttostr(i))));  
  end;  
   
   
   
  end.  
 

转载于:https://www.cnblogs.com/delphi2007/archive/2008/11/18/1335917.html

转载地址:https://blog.csdn.net/aibi9196/article/details/101304693 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:求在网格里显示图片的方案
下一篇:求delphi 对MD5的标准源码

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月09日 01时01分35秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

简单解决某盘限速?(黑科技)【油猴】+【某盘直链下载器】+【IDM下载】 2019-04-26
2019 ACM训练计划——( 每天5题 ) 训练计划⑦ 2019-04-26
Codeforces Round #587 (Div. 3), problem: (D) Swords 【数学+gcd+奇妙解题?】 2019-04-26
Codeforces Round #587 (Div. 3), problem: (E1) Numerical Sequence (easy version)【有优化版的暴力解法+读入写出挂运用】 2019-04-26
解决VMware装上Mac后icloud无法激活 【安装QQ发现不能注册Apple ID】 2019-04-26
2019 ACM训练计划——( 每天5题 ) 训练计划⑧ 2019-04-26
2019 ACM训练计划——( 每天5题 ) 训练计划⑨ 2019-04-26
2019 ACM训练计划——( 每天5题 ) 训练计划⑩ 2019-04-26
2019 ACM训练计划——( 每天5题 ) 训练计划 11 2019-04-26
Codeforces Round #555 (Div. 3), problem: (E) Minimum Array【贪心+二分 lower_bound+multiset初见】 2019-04-26
Codeforces Round #555 (Div. 3), problem: (C1) Increasing Subsequence (easy version) 【贪心】 2019-04-26
Codeforces Round #555 (Div. 3), problem: (C2) Increasing Subsequence (hard version)【贪心+撞到南墙也不回头】 2019-04-26
2019 ACM训练计划——( 每天5题 ) 训练计划12 2019-04-26
Codeforces Round #590 (Div. 3), problem: (D) Distinct Characters Queries 【线段树+维护二进制】 2019-04-26
2019 ACM训练计划——( 每天5题 ) 训练计划13 2019-04-26
[计算机图形学经典算法] 如何处理多边形的水平边?【扫描线算法+个人解答(非官方正解)】 2019-04-26
Codeforces Round #277.5 (Div. 2), problem: (C) Given Length and Sum of Digits...(贪心)【贪心策略:最小值与最大值】 2019-04-26
HNUCM_入门级题库 (练习1)【题解】 2019-04-26
HNUCM 19级ACM训练计划【题解模板】 2019-04-26
2019 ACM训练计划——( 每天5题 ) 训练计划14 2019-04-26