Embarcadero Delphi
अपडेटेड TDataSet डेटा को बैकग्राउंड थ्रेड में पुनः प्राप्त करना
खोज…
टिप्पणियों
यह फायरडैक उदाहरण, और अन्य जिन्हें मैं प्रस्तुत करने की योजना बना रहा हूं, वे देशी कॉल के उपयोग से बचने के लिए एसिंक्रोनस रूप से डेटासेट खोल देंगे।
फायरडैक उदाहरण
नीचे दिया गया कोड नमूना फायरस्कैक का उपयोग करके एक पृष्ठभूमि थ्रेड में MSSql सर्वर से रिकॉर्ड प्राप्त करने का एक तरीका दिखाता है। डेल्फी 10 सिएटल के लिए परीक्षण किया गया
जैसा लिखा गया है:
थ्रेड अपने स्वयं के TFDConnection और TFDQuery का उपयोग करके डेटा को पुनः प्राप्त करता है और डेटा को Sychronize () में कॉल में FDQuery के रूप में स्थानांतरित करता है।
Execute केवल एक बार डेटा पुनर्प्राप्त करता है। वीसीएल थ्रेड से पोस्ट किए गए संदेश के जवाब में बार-बार क्वेरी को चलाने के लिए इसे बदला जा सकता है।
कोड:
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