起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 1481|回复: 30

多线程 **

[复制链接]
发表于 2006-4-18 12:48:02 | 显示全部楼层 |阅读模式
比如说导数据的时候,数据量大的话,速度就太慢了
能不能执行这样的操作的时候另开一个线程,弹出个窗体之类的,执行完之后再关闭该窗体 ??
给个demo吧,谢谢!
回复

使用道具 举报

 楼主| 发表于 2006-4-18 18:33:38 | 显示全部楼层
有人来看看么。。。
回复 支持 反对

使用道具 举报

发表于 2006-4-18 19:03:04 | 显示全部楼层
var
  ss: String;

type
  TMyThread = class(TThread)
  public
    procedure Execute; override;
  end;

procedure TMyThread.Execute;
var
  i: Integer;
  l: Integer;
begin
  try
    for i:=0 to 65535 do
    begin
      l := i;
      l := 2*l;
      for l:=0 to 65535 do ;
      ss := SysUtils.IntToStr(i);
    end;
     // Borland.Delphi.Windows.Sleep(1000);
  except
  end;
end;

procedure TMainForm.Button2Click(Sender: TObject);
var
  t: TMyThread;
begin
  t := TMyThread.Create(True);
  t.Resume;
end;

procedure TMainForm.Button3Click(Sender: TObject);
begin
  dialogs.Showmessage(ss);
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-20 11:36:38 | 显示全部楼层
怎么在 TMyThread.Execute 中调用控件 ??比如说DataGrid
回复 支持 反对

使用道具 举报

发表于 2006-4-20 15:21:19 | 显示全部楼层
unit MainForm;

interface

uses
  Business.System, Business.Forms, Business.Model, Business.Data;

var
  ss: String;

type
  TMyThread = class(TThread)
  private
    FForm: TMainForm;
  public
    procedure Execute; override;
    property Form: TMainForm read FForm write FForm;
  end;

type
  TMainForm = class(TForm)
    DataNavigator1: TDataNavigator;
    DataGrid1: TDataGrid;
    DataSetBroker1: TDataSetBroker;
    InfoBroker1: TInfoBroker;
    FuncBroker1: TFuncBroker;
    DataGrid1CARDCODE: TDataGridColumn;
    DataGrid1CARDNAME: TDataGridColumn;
    DataGrid1CARDTYPE: TDataGridColumn;
    DataGrid1MAILADDRES: TDataGridColumn;
    DataGrid1MAILZIPCOD: TDataGridColumn;
    DataGrid1PHONE1: TDataGridColumn;
    DataGrid1PHONE2: TDataGridColumn;
    DataGrid1BDSJSZD1: TDataGridColumn;
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    {private declarations}
  public
    {public declarations}
  end;

implementation

procedure TMyThread.Execute;
var
  i: Integer;
  l: Integer;
begin
  try
    for i:=0 to 65535 do
    begin
      l := i;
      l := 2*l;
      for l:=0 to 65535 do
      begin
        ss := SysUtils.IntToStr(i);
        FForm.DataGrid1.Visible:= False;       //访问DataGrid
      end
    end;
     // Borland.Delphi.Windows.Sleep(1000);
  except
  end;
end;

procedure TMainForm.Button2Click(Sender: TObject);
var
  t: TMyThread;
begin
  t := TMyThread.Create(true);
  t.Form := self;
  t.Resume;
end;

procedure TMainForm.Button3Click(Sender: TObject);
begin
  dialogs.Showmessage(ss);
end;

end.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-20 16:08:53 | 显示全部楼层
procedure TSJWG1.Button1Click(Sender: TObject);
var
  t: TMyThread;
  lForm : TCT1 ;
begin
//  lForm := TCT1.Create(Context) ;
//  lForm.Show ;
  t := TMyThread.Create(True);
  lForm := TCT1.Create(Context) ;
  lForm.Show ;
  t.Form := Self ;
  t.Execute  ;
  lForm.Free ;
end;

我这样调用另外一个窗体,但是调出来的窗体上没有任何东西,Label都没有显示出来
回复 支持 反对

使用道具 举报

发表于 2006-4-20 17:18:49 | 显示全部楼层
var
  ss: String;

type
  TMyThread = class(TThread)
  private
    FForm: TCT1Form;
  public
    procedure Execute; override;
    property Form: TCT1Form read FForm write FForm;
  end;

procedure TMyThread.Execute;
begin
  FForm.Label1.Caption := 'ssss';
end;

procedure TMainForm.Button4Click(Sender: TObject);
var
  t: TMyThread;
  lForm : TCT1Form;
begin
  t := TMyThread.Create(True);
  lForm := TCT1Form.Create(Context) ;
  try
    t.Form := lForm;
    t.Execute;
    lForm.ShowModal ;
  finally
    lForm.Free ;
  end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-21 09:17:43 | 显示全部楼层
不知道是不是我没看明白 --
我是想执行buttonclick时调用另外一个窗体,同时执行当前窗体上的数据导出,数据导完后,自动关闭被调用的窗体,6楼的代码能够实现这样的功能,但是被调用的窗体上什么都没有
回复 支持 反对

使用道具 举报

发表于 2006-4-21 10:06:14 | 显示全部楼层
如果在线程中需要修改显示的内容,比如窗体的内容显示,不能直接修改,不然会死机的
我印象是写一个过程,然后调用syXXX的函数来调用这个过程,实际上,是把这个过程的执行放到主线程中来修改显示内容的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-21 10:11:05 | 显示全部楼层
并不要修改内容,只要调用窗体就行,那个窗体上是个静态的label,想再加个计时器就ok了,不要传参数之类的
但是LForm.Show 连静态的Label都不显示出来
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-8 06:59 , Processed in 0.040481 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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