Search Results for

    Show / Hide Table of Contents

    Клиентское многопоточное приложение

    Вы можете найти все исходные файлы этого примера в папке "\\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;
    
    Back to top © 1998-2024 ООО «Быстрые отчеты»