起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 319|回复: 8

【结】多线程**

[复制链接]
发表于 2008-3-11 13:14:10 | 显示全部楼层 |阅读模式
我用了多程 在里面怎么访问不了表单里的组件 ,总提示没有声明
我明明声明了 帮看看把




unit ZDXJ1;

interface

uses
  Business.System, Business.Model, Business.Forms,borland.Delphi.WinInet,
  Business.Forms, business.System.StringUtils, Business.Data;
var
   ss:string;
  type
    TMyThread=class(TThread)
  private
    FForm: TZDXJ1;
  public

  procedure  Execute;override;
  end;
type
  TZDXJ1 = class(TFormDoc)
    InfoBroker: TInfoBroker;
    DataSetBroker1: TDataSetBroker;
    Timer1: TTimer;
    ImageList1: TImageList;
    datagrid1Column1: TDataGridColumn;
    datagrid1URL: TDataGridColumn;
    datagrid1Column3: TDataGridColumn;
    datagrid1Column4: TDataGridColumn;
    datagrid1Column5: TDataGridColumn;
    datagrid1Column6: TDataGridImageColumn;
    Button1: TButton;
    Button2: TButton;
    datagrid1: TDataGrid;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormDocCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    lDataSet:TDataSet;
     {private declarations}

  public
    procedure GetData;
    function  GetInfo(Number:integer):string;
    function  Islive(Number:integer):String;
    {public declarations}
  end;

implementation
procedure TMyThread.Execute;
var
   Number:integer;
   Url,Flag:String;
begin
   FForm.DataGrid1.Visible:=false;
end;
procedure TZDXJ1.Button1Click(Sender: TObject);
var
   // GetData:string;
   // Flag:integer;
   T:TMyThread;
begin
       T:=TMyThread.Create(True);
       T.Resume;
end;
回复

使用道具 举报

 楼主| 发表于 2008-3-11 13:16:13 | 显示全部楼层

补充

代码编译没问题了,就是运行时FForm总是空对象
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-11 13:46:16 | 显示全部楼层
有人吗 帮忙看看啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-11 14:15:25 | 显示全部楼层
还没人看吗?顶一下
回复 支持 反对

使用道具 举报

发表于 2008-3-11 15:25:45 | 显示全部楼层
类和类不能直接访问的.  线程想访问FORM1,必须在创建线程时把FORM对象传递进来.
回复 支持 反对

使用道具 举报

发表于 2008-3-11 15:27:50 | 显示全部楼层
看Delphi6\Demos\Threads  里面的例子
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-11 15:53:15 | 显示全部楼层
:eek:
已经引入了 不过速度没预期的快
能帮我看下下面的程序吗?我是想对数据集中的URL逐个采取PING 操作 ,然后把是否PING通等信息存回表里,如果不用多线程,当PING 不通时,会等待一段时间,这样影响效率.
我的代码运行时有时还会报错.说数据集不处于编辑状态.是哪写的不对吗?

unit ZDXJ1;

interface

uses
  Business.System, Business.Model, Business.Forms,borland.Delphi.WinInet,
  Business.Forms, business.System.StringUtils, Business.Data;
var
   ss:string;
  type
    TMyThread=class(TThread)
  private
   FForm: TZDXJ1;
   context:TContext;
  public
  property Form: TZDXJ1 read FForm write FForm;
  procedure  Execute;override;
  end;
type
  TZDXJ1 = class(TFormDoc)
    InfoBroker: TInfoBroker;
    DataSetBroker1: TDataSetBroker;
    Timer1: TTimer;
    ImageList1: TImageList;
    datagrid1Column1: TDataGridColumn;
    datagrid1URL: TDataGridColumn;
    datagrid1Column3: TDataGridColumn;
    datagrid1Column4: TDataGridColumn;
    datagrid1Column5: TDataGridColumn;
    datagrid1Column6: TDataGridImageColumn;
    Button1: TButton;
    Button2: TButton;
    datagrid1: TDataGrid;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormDocCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    lDataSet:TDataSet;
     {private declarations}

  public
    procedure GetData;
    function  GetInfo(Number:integer):string;//取错误信息
    function  Islive(Number:integer):String;//判断是否存活
    {public declarations}
  end;

implementation
procedure TMyThread.Execute;
var
   Number:integer;
   Url,Flag:String;
   //i: Integer;
  // l: Integer;

begin
   
       FForm:= TZDXJ1.Create(self.context);
       FForm.GetData;
       FForm.lDataset.First;
       while not FForm.lDataset.Eof do
       begin
       FForm.lDataset.Edit;
       Url:=FForm.lDataset.FieldByName('应用URL').AsString;
       Number:=ThirdPkg.unit2.CheckedUrl(Url,50000);//DLL引用到平台的函数PING地址
       FForm.lDataset.FieldByName('是否存活').AsString:=FForm.Islive(Number);
       FForm.lDataset.FieldByName('返回信息').AsString:=FForm.GetInfo(Number);
       FForm.lDataset.Next;
       end;

end;
procedure TZDXJ1.Timer1Timer(Sender: TObject);
var
   //Number:integer;
   //Url,Flag:String;
   T:TMyThread;
begin
        T:=TMyThread.Create(True);
        T.context:=self.Context;
        T.Form:=self;
        T.Resume;
end;
回复 支持 反对

使用道具 举报

发表于 2008-3-11 23:20:48 | 显示全部楼层
线程是并行的,所以有时说数据集不处于编辑状态.
CheckedUrl是否支持线程也是个入手点.因为很多的对象是线程不安全的,会加同步的过程.这样其不会发挥线程的优势.
楼主可以加进度条等方式让用户有个视觉上的感觉就会好多了.不必要非要做成多线程.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-13 11:14:14 | 显示全部楼层
恩  不过不用多线程速度太慢了   还是谢谢了.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-8 03:46 , Processed in 0.039445 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表