CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

请教各位:关于线程的两个问题!多谢了!

楼主chenyf2006()2004-12-03 09:45:39 在 Delphi / VCL组件开发及应用 提问

以下是我自己写的MyThread.pas ,运行时出现了两个问题:  
    1.程序执行到Synchronize(InitEdit);就停在此处不动作了!  
    2.若把Synchronize(InitEdit);注释掉,则界面上的Edit内容没有任何改变。  
   
  请各位告知,先谢了!   
   
   
  unit   MyThread;//MyThread.pas  
   
  interface  
   
  uses  
      Windows,   SysUtils,Classes,StdCtrls,Dialogs;  
   
  type  
      TMyThread   =   class(TThread)  
      private  
          {   Private   declarations   }  
          ED:TEdit;  
          procedure   InitEdit;             //初始化Edit  
          procedure   UpdateEdit;     //修改Edit  
      protected  
          procedure   Execute;   override;  
      published  
          constructor   CreateIt(ED:TEdit);  
          destructor   Destroy;override;  
      end;  
   
  implementation  
   
  constructor   TMyThread.CreateIt(ED:TEdit);  
  begin  
        inherited   Create(false);  
        FreeOnTerminate   :=   true;  
   
        Synchronize(InitEdit);-------1.执行到此句出错,程序停在此处不动作了!  
   
        Suspended:=false;  
  end;  
  //--------------------------------------------------------------------  
  procedure   TMyThread.InitEdit;       //初始化Edit  
  begin  
        ED.Text:='';  
  end;  
  //--------------------------------------------------------------------  
  procedure   TMyThread.UpdateEdit;     //修改Edit  
  var   CostTime:integer;  
          StartTicker,EndTicker:integer;  
          i,j:integer;  
  begin  
   
          StartTicker   :=   GetTickCount;  
          i:=0;  
          for   i:=0   to   1000   do  
          begin  
                  CostTime:=GetTickCount-StartTicker;  
                  ED.Text:=IntToStr(CostTime);------2.此处出错!  
                              //为何界面上的Edit1的内容没有任何改变?  
          end;  
   
  end;  
  //--------------------------------------------------------------------  
  procedure   TMyThread.Execute;  
  begin  
      Synchronize(UpdateEdit);  
   
  end;  
  //--------------------------------------------------------------------  
  destructor   TMyThread.Destroy;  
  begin  
        PostMessage(Form1.Handle,wm_ThreadDoneMsg,self.ThreadID,0);  
        inherited   destroy;  
  end;  
   
  end. 问题点数:0、回复次数:5Top

1 楼hellolongbin(一个人(自从扩充话题改版,再也不去灌水乐园了))回复于 2004-12-03 10:01:22 得分 0

你的Ed是动态创建的还是别的窗体上的?如果是其他窗体上的直接操作当然不行ED.Text:=IntToStr(CostTime);Top

2 楼chenyf2006()回复于 2004-12-03 10:20:54 得分 0

是别的窗体上的,那么如何改呢?Top

3 楼chenyf2006()回复于 2004-12-08 08:57:39 得分 0

各位高手,帮帮忙吧!先谢了!Top

4 楼zeroxing(胸无半点墨,腰有万贯财;此般理想高,怎奈做不到!)回复于 2004-12-08 09:15:21 得分 0

我看你的意思,是在CreateIt的时候,把ED传到线程里面来,但是你在CreateIt构建过程里面,完全就不理会ED的传入。而你在InitEdit里面用到的ED则是一个没有创建的TEdit的对象变量而已,你当然会出错。在这里,对象的成员变量和过程的局部参数变量,我想你是搞混淆了。在CreateIt里面增加一句:Self.Ed   :=   ED;差不多就应该可以了。  
   
  还有就是,你的这个线程其实没有什么用,所有的操作都放在Synchronize里面进行,也就是说都是附着在主线程里面进行的,这就和单线程没有任何的差别,这样的话,就不必要用多线程来去做了。Top

5 楼chenyf2006()回复于 2004-12-08 10:38:48 得分 0

谢谢   hellolongbin(一个人)   和zeroxing(光头)的回答   !!!  
   
  TO   zeroxing(光头)   :按你的提示我修改了变量ED,也试过Self.Ed   :=   ED,  
  程序还是停在Synchronize(InitEdit);就不动作了,请再帮我看看吧!谢谢!  
   
  type  
      TMyThread   =   class(TThread)  
      private  
          {   Private   declarations   }  
          ED_T:TEdit;*********增加了对象的成员变量**********  
          procedure   InitEdit  
          procedure   UpdateEdit;      
      protected  
          procedure   Execute;   override;  
      published  
          constructor   CreateIt(ED:TEdit);***过程的局部参数变量保持不变***  
          destructor   Destroy;override;  
      end;  
   
  implementation  
  uses   Unit_TwoThread;  
  //------------------------------------------------------------------------------  
  constructor   TMyThread.CreateIt(ED:TEdit);  
  var     a1:String;  
  begin  
        inherited   Create(true);  
        FreeOnTerminate   :=   true;  
        a1   :=   ED.Text;---------------当程序执行到此处,a1='Edit1';说明参数传递成功了。  
        ED_T   :=   ED;  
        Synchronize(InitEdit););-----但执行到此句,程序仍停在此处不动作了!  
        Suspended:=false;  
  end;  
  //------------------------------------------------------------------------------  
  procedure   TMyThread.InitEdit;       //初始化Edit  
  begin  
        ED_T.Text   :=   '11';  
  end;Top

相关问题

  • 急死我了!串口读写和多线程的几个问题,千万帮忙阿!菜鸟多谢各位,感激涕零!!
  • 各位大虾:请问在VB中如何使用多线程?(可以调用其它语言(如VC)写的DLL),高分送上,多谢!!!
  • 救救小弟!delphi 下的clint/sever和多线程、对硬件的控制应该怎么弄啊!多谢各位大虾!
  • 关于线程的一个小问题,多谢!
  • 线程两问
  • 多线程 请教各位
  • 多线程中,如何在主线程和其他线程中公用StringList,这个stringList如何传入到其他子线程中?多谢!!
  • 两个非常菜的问题,希望各位帮忙回答一下,多谢!!
  • 各位高手,小弟有两个问题想问。多谢解答!
  • 各位大虾,谁有WinRunner的下载连接?多谢!多谢!

关键词

  • 线程
  • 执行
  • 修改
  • initedit
  • createit
  • ed
  • tmythread
  • costtime
  • updateedit
  • 变量

得分解答快速导航

  • 帖主:chenyf2006

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo