我现在把线程里的数据通过事件传给主程序,在程序里的接收事件里调试是发现线程已成功把数据传出来了,
写到日志文件里也成功,但是不能显示到主程序的界面里,我试过在主程序里加一个定时器来改变一个数值然
后显示出来,这样试是成功的,说明界面没有被冻结,但在自定义事件里读到从线程里出来的数据却显示不了,
请问是什么原因呢?请大家指点一下.主要代码如下:
type
  THttpBeginWorkNotify = procedure(sender: tobject; size: integer) of object;    //在线程里自定义一个事件public
    OnHttpWorkBegin: THttpBeginWorkNotify;   //下载开始事件
end;//线程里定义下载控件及取下载数据的过程函数
idhttp.OnWorkBegin := HttpWorkBegin;   
procedure TDownLoadThread.HttpWorkBegin(Sender: TObject; WorkMode: TWorkMode;
  WorkCountMax: Integer);
begin
  try
    intCurAllSize := WorkCountMax;   //取到当前文件的最大值
    synchronize(DoHttpWorkBegin);     //通过事件,把值传递出去
  except  end;
  
end;procedure TDownLoadThread.DoHttpWorkBegin;
begin
  try
    if assigned(OnHttpWork) then
      OnHttpWorkBegin(self, intCurAllSize); //会转到主程序上的ComDownWork函数
  except  end;
  
end;在主程序里取从线程里传出来的数据:
procedure TfrmMain.DownWorkBegin(sender: tobject;size: integer);
var
  i:integer;
begin
   i:=size;
   lable1.caption:=inttostr(i);  //却没反应
end;

解决方案 »

  1.   

    好像在线程中使用TIdHTTP可以在TIdHTTP的方法中直接与界面交互,不用synchronize也不用事件那么麻烦吧
      

  2.   

    procedure TDownLoadThread.HttpWorkBegin(Sender: TObject; WorkMode: TWorkMode; 
      WorkCountMax: Integer); 
    begin 
      try 
        intCurAllSize := WorkCountMax;   //取到当前文件的最大值 
         //在这加一句试下
         FrmMain.lable1.caption:=inttostr(WorkCountMax);  //显示数值     synchronize(DoHttpWorkBegin);     //通过事件,把值传递出去 
      except   end; 
       
    end;