Клиентское многопоточное приложение
Вы можете найти все исходные файлы этого примера в папке "\\Demos\\ClientServer\\Client\\Advanced".
Этот пример показывает, как можно использовать компонент "TfrxReportClient" в потоках.
Класс потока:
TfrxClientTestThread = class (TThread)
protected
procedure Execute; override;
private
CountRep: Integer;
ErrorsCount: Integer;
Log: TMemo;
ThreadID: Integer;
procedure AppendLog;
procedure FinishLog;
public
Report: TfrxReportClient;
constructor Create(C: TfrxServerConnection; RepName: String; Id: Integer; Rep: Integer; L: TMemo);
destructor Destroy; override;
end;
Конструктор класса TfrxClientTestThread:
constructor TfrxClientTestThread.Create(C: TfrxServerConnection; RepName: String; Id: Integer; Rep: Integer; L: TMemo);
begin
inherited Create(True);
FreeOnTerminate := False;
ErrorsCount := 0;
ThreadId := Id;
CountRep := Rep;
Log := L;
Report := TfrxReportClient.Create(nil);
Report.EngineOptions.ReportThread := Self;
Report.Connection := C;
Report.ReportName := RepName;
Resume;
end;
Метод TfrxClientTestThread.Execute
отправляет на сервер серию запросов. Вся полученная информация отображается в Memo1 методами "AppendLog" и "FinishLog":
procedure TfrxClientTestThread.Execute;
var
i: Integer;
begin
inherited;
for i := 1 to CountRep do
begin
if Terminated then break;
Report.PrepareReport;
if not Terminated then
begin
Synchronize(AppendLog);
ErrorsCount := ErrorsCount + Report.Errors.Count;
end;
end;
Synchronize(FinishLog);
end;
Перед запуском этой программы запустите серверное приложение, описанное выше.
По нажатию кнопки "Thread test" выполнится приведенный ниже код:
procedure TMainForm.TestBtnClick(Sender: TObject);
var
i, j, k: Integer;
Thread: TfrxClientTestThread;
begin
frxServerConnection1.Host := Host.Text;
frxServerConnection1.Port := StrToInt(Port.Text);
frxServerConnection1.Login := Login.Text;
frxServerConnection1.Password := Password.Text;
frxServerConnection1.Compression := Compression.Checked;
if (Length(ProxyHost.Text) > 0) then
begin
frxServerConnection1.PrxoyHost := ProxyHost.Text;
frxServerConnection1.ProxyPort := StrToInt(ProxyPort.Text);
end;
ClearThreads;
Memo1.Lines.Add('Start test');
j := StrToInt(Threads.Text);
k := StrToInt(Rep.Text);
for i := 1 to j do
begin
Thread := TfrxClientTestThread.Create(frxServerConnection1, ReportsList[ListBox1.ItemIndex], i, k, Memo1);
ThreadList.Add(Thread);
end;
end;