线程和主界面的交互的演示代码
求一个线程和主界面的交互的演示代码
求一个线程和主界面的交互的演示代码。线程和主界面处于两个Unit。线程中的user中不能引用主窗口。我只是想学习一下,线程和主界面交互的方法。去网上查了好几天资料,能查到的都是user中引用主窗口的方法。据说可以通过别的方法实现,求大神指点下了。跪求~~~
------解决方案--------------------
就用DELPHI自带的DEMO。DELPHI 7 中目录如下:
C:\Program Files\Borland\Delphi7\Demos\Threads\thrddemo.dpr
------解决方案--------------------
让我来教你一招吧:
用类似回调函数的方法:
第一:在线程的unit中定义:TCallFunction = procedure of object;
第二:在线程类中定义一个公共变量:FCallMain: TCallFunction;
第三:在主界面unit中定义一个函数:procedure TMain.Test();
第四:假设线程类的实例是ThreadA,让ThreadA.FCallMain=Test;
第五:在线程类就可以直接用 FCallMain了,
FCallMain的功能跟主界面的Test功能是一样的,如果Test函数有操作界面的操作,需要按照下面调用:
synchronize(FCallMain);
明白了吧??
------解决方案--------------------
synchronize实际上是把子线程的代码放到主线程里执行
另外线程和主线程交互的方法还可以用消息来实现
------解决方案--------------------
我給你個簡單的:
主單元:
unit TestThreadMainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB,TQueryThreadUnit, ComCtrls;
type
TForm1 = class(TForm)
ADODataSet1: TADODataSet;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Button1: TButton;
StatusBar1: TStatusBar;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
//CoInitialize(nil);
try
TQueryThread.Create(ADODataset1,DataSource1,StatusBar1);
StatusBar1.SimpleText := '請等待,正在打開數據表......';
StatusBar1.SimplePanel := True;
finally
//CoUninitialize;
end;
//ADODataSet1.Open;
end;
end.
線程單元:
unit TQueryThreadUnit;
interface
uses
Classes,ADODB,DB,ActiveX,ComCtrls;
type
TQueryThread = class(TThread)
private
FDataSet :TADODataSet;
FDataSource :TDataSource;
FStatusBar :TStatusBar;
procedure HookUpUI;
{ Private declarations }
protected
procedure Execute; override;
public
constructor Create(ADataSet:TADODataSet;ADataSource:TDataSource;AStatusBar:TStatusBar);virtual;
end;
implementation
{ 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 TQueryThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ TQueryThread }
constructor TQueryThread.Create(ADataSet:TADODataSet;ADataSource:TDataSource;AStatusBar:TStatusBar);
begin
inherited Create(True);
FDataSet := ADataSet;
FDataSource := ADataSource;
FStatusBar := AStatusBar;
FreeOnTerminate := True;
Resume;
end;
procedure TQueryThread.Execute;
begin
{ Place thread code here }
CoInitialize(nil);
try
if not FDataSet.Active then FDataSet.Open;
Synchronize(HookUpUI);
finally
CoUninitialize;
end;
end;
procedure TQueryThread.HookUpUI;
begin
FDataSource.DataSet := FDataSet;
FStatusBar.SimpleText := '已經打開數據表!';
end;
end.
求一个线程和主界面的交互的演示代码。线程和主界面处于两个Unit。线程中的user中不能引用主窗口。我只是想学习一下,线程和主界面交互的方法。去网上查了好几天资料,能查到的都是user中引用主窗口的方法。据说可以通过别的方法实现,求大神指点下了。跪求~~~
------解决方案--------------------
就用DELPHI自带的DEMO。DELPHI 7 中目录如下:
C:\Program Files\Borland\Delphi7\Demos\Threads\thrddemo.dpr
------解决方案--------------------
让我来教你一招吧:
用类似回调函数的方法:
第一:在线程的unit中定义:TCallFunction = procedure of object;
第二:在线程类中定义一个公共变量:FCallMain: TCallFunction;
第三:在主界面unit中定义一个函数:procedure TMain.Test();
第四:假设线程类的实例是ThreadA,让ThreadA.FCallMain=Test;
第五:在线程类就可以直接用 FCallMain了,
FCallMain的功能跟主界面的Test功能是一样的,如果Test函数有操作界面的操作,需要按照下面调用:
synchronize(FCallMain);
明白了吧??
------解决方案--------------------
synchronize实际上是把子线程的代码放到主线程里执行
另外线程和主线程交互的方法还可以用消息来实现
------解决方案--------------------
我給你個簡單的:
主單元:
unit TestThreadMainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB,TQueryThreadUnit, ComCtrls;
type
TForm1 = class(TForm)
ADODataSet1: TADODataSet;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Button1: TButton;
StatusBar1: TStatusBar;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
//CoInitialize(nil);
try
TQueryThread.Create(ADODataset1,DataSource1,StatusBar1);
StatusBar1.SimpleText := '請等待,正在打開數據表......';
StatusBar1.SimplePanel := True;
finally
//CoUninitialize;
end;
//ADODataSet1.Open;
end;
end.
線程單元:
unit TQueryThreadUnit;
interface
uses
Classes,ADODB,DB,ActiveX,ComCtrls;
type
TQueryThread = class(TThread)
private
FDataSet :TADODataSet;
FDataSource :TDataSource;
FStatusBar :TStatusBar;
procedure HookUpUI;
{ Private declarations }
protected
procedure Execute; override;
public
constructor Create(ADataSet:TADODataSet;ADataSource:TDataSource;AStatusBar:TStatusBar);virtual;
end;
implementation
{ 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 TQueryThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ TQueryThread }
constructor TQueryThread.Create(ADataSet:TADODataSet;ADataSource:TDataSource;AStatusBar:TStatusBar);
begin
inherited Create(True);
FDataSet := ADataSet;
FDataSource := ADataSource;
FStatusBar := AStatusBar;
FreeOnTerminate := True;
Resume;
end;
procedure TQueryThread.Execute;
begin
{ Place thread code here }
CoInitialize(nil);
try
if not FDataSet.Active then FDataSet.Open;
Synchronize(HookUpUI);
finally
CoUninitialize;
end;
end;
procedure TQueryThread.HookUpUI;
begin
FDataSource.DataSet := FDataSet;
FStatusBar.SimpleText := '已經打開數據表!';
end;
end.