Embarcadero Delphi
백그라운드 스레드에서 업데이트 된 TDataSet 데이터 검색
수색…
비고
이 FireDAC 예제와 제출할 다른 것들은 비동기 적으로 데이터 세트를 열 수있는 네이티브 호출의 사용을 피할 것입니다.
FireDAC 예제
아래 코드 샘플은 FireDAC을 사용하는 백그라운드 스레드의 MSSql 서버에서 레코드를 검색하는 한 가지 방법을 보여줍니다. Delphi 10 Seattle에서 테스트되었습니다.
서면으로 :
스레드는 자체 TFDConnection 및 TFDQuery를 사용하여 데이터를 검색하고 Sychronize () 호출시 데이터를 양식의 FDQuery로 전송합니다.
Execute는 데이터를 한 번만 검색합니다. VCL 스레드에서 게시 된 메시지에 대한 응답으로 쿼리를 반복적으로 실행하도록 변경 될 수 있습니다.
암호:
type
TForm1 = class;
TFDQueryThread = class(TThread)
private
FConnection: TFDConnection;
FQuery: TFDQuery;
FForm: TForm1;
published
constructor Create(AForm : TForm1);
destructor Destroy; override;
procedure Execute; override;
procedure TransferData;
property Query : TFDQuery read FQuery;
property Connection : TFDConnection read FConnection;
property Form : TForm1 read FForm;
end;
TForm1 = class(TForm)
FDConnection1: TFDConnection;
FDQuery1: TFDQuery;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
Button1: TButton;
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
public
QueryThread : TFDQueryThread;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TFDQueryThread }
constructor TFDQueryThread.Create(AForm : TForm1);
begin
inherited Create(True);
FreeOnTerminate := False;
FForm := AForm;
FConnection := TFDConnection.Create(Nil);
FConnection.Params.Assign(Form.FDConnection1.Params);
FConnection.LoginPrompt := False;
FQuery := TFDQuery.Create(Nil);
FQuery.Connection := Connection;
FQuery.SQL.Text := Form.FDQuery1.SQL.Text;
end;
destructor TFDQueryThread.Destroy;
begin
FQuery.Free;
FConnection.Free;
inherited;
end;
procedure TFDQueryThread.Execute;
begin
Query.Open;
Synchronize(TransferData);
end;
procedure TFDQueryThread.TransferData;
begin
Form.FDQuery1.DisableControls;
try
if Form.FDQuery1.Active then
Form.FDQuery1.Close;
Form.FDQuery1.Data := Query.Data;
finally
Form.FDQuery1.EnableControls;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
QueryThread.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if not QueryThread.Finished then
QueryThread.Start
else
ShowMessage('Thread already executed!');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FDQuery1.Open;
QueryThread := TFDQueryThread.Create(Self);
end;
end.
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow