// ¾Æ·¡ ¿¹Á¦´Â INPRISE TI ¿¡ ÀÖ´Â ³»¿ëÀÔ´Ï´Ù
// ¿¹Á¦¸¸ Á¶±Ý ¹Ù²Ù¾ú½À´Ï´Ù
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DBTables, Db, StdCtrls, Grids, DBGrids, ComCtrls;
type
TForm1 = class(TForm)
Database1: TDatabase;
Query1: TQuery;
Query2: TQuery;
Query3: TQuery;
DataSource1: TDataSource;
DataSource2: TDataSource;
DataSource3: TDataSource;
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
DBGrid3: TDBGrid;
Button1: TButton;
ProgressBar1: TProgressBar;
Session1: TSession;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TQueryThread = class(TThread)
private
FDatabase: TDataBase;
FQuery: TQuery;
FDatasource: TDatasource;
FQueryException: Exception;
procedure ConnectDataSource;
procedure ShowQryError;
protected
procedure Execute; override;
public
constructor Create(Session: TSession; DataBase:
TDatabase; Query: TQuery; DataSource: TDataSource); virtual;
end;
var
Form1: TForm1;
implementation
constructor TQueryThread.Create(Session: TSession; DataBase:
TDatabase; Query: TQuery; Datasource: TDataSource);
begin
// thread objectÀÇ instance¸¦ »ý¼ºÇÑ´Ù
// CreateÀÇ ÆÄ¶ó¹ÌÅͰ¡ FalseÀ̸é thread¸¦ »ý¼ºÇÑÈÄ Áï½Ã Execute¸¦ È£ÃâÇÏ¿© ½ÇÇàÇÑ´Ù
// " TrueÀ̸é ResumeÀ» È£ÃâÇϱâ Àü±îÁö ½ÇÇàÇÏÁö ¾Ê´Â´Ù(suspended)
inherited Create(True);
FDatabase := DataBase;
FQuery := Query;
FDataSource := Datasource;
// threadÀÇ ½ÇÇàÀÌ Á¾·áÇϸé ÀÚµ¿À¸·Î freeµÇ°Ô ¼³Á¤
FreeOnTerminate := True;
// ½ÇÇàÀÌ ÀϽà ÁßÁöµÈ(suspended) thread¸¦ ½ÇÇàÇÑ´Ù
Resume;
end;
procedure TQueryThread.Execute;
begin
try
// Query¸¦ openÇϰí DataSource¸¦ ¿¬°áÇÑ´Ù
FQuery.Open;
// thread°£ÀÇ Ãæµ¹À» ÇÇÇÏ¿© ConnectDataSource ¸¦ È£ÃÍÇÑ´Ù
Synchronize(ConnectDataSource);
except
// Handle the exception
FQueryException := ExceptObject as Exception;
// thread°£ÀÇ Ãæµ¹À» ÇÇÇÏ¿© ShowQryError ¸¦ È£ÃÍÇÑ´Ù
Synchronize(ShowQryError);
end;
end;
procedure TQueryThread.ConnectDataSource;
begin
// DataSource¸¦ ¿¬°áÇÑ´Ù
FDataSource.DataSet := FQuery;
end;
procedure TQueryThread.ShowQryError;
begin
// Handle the exception
Application.ShowException(FQueryException);
end;
procedure RunBackgroundQuery(Session: TSession; DataBase: TDataBase;
Query: TQuery; DataSource: TDataSource);
begin
{thread instance »ý¼º}
TQueryThread.Create(Session, Database, Query, DataSource);
end;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
{º´·Äó¸®: 3°³ÀÇ Query¸¦ thread¸¦ »ç¿ëÇÏ¿© openÇÑ´Ù}
RunBackgroundQuery(Session1, DataBase1, Query1, Datasource1);
RunBackgroundQuery(Session1, DataBase1, Query2, Datasource2);
RunBackgroundQuery(Session1, DataBase1, Query3, Datasource3);
(* ¼øÂ÷ó¸®: ÀϹÝÀûÀÎ Query Open
Query1.Open;
Query2.Open;
Query3.Open;
*)
for i := 1 to 100 do
ProgressBar1.Position := i;
end;
end.
|
|