Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > В трехзвенке не отрабатывает поток


Автор: KAnAn 22.8.2009, 11:52
Трехзвенка, Delphi 7, Oracle, MDI-приложение, TSocketConnection, на серверной части (TSQLQuery-TDataSetProvider), на клиенте (TClientDataSet - TDataSource).
При работе без использования потока все работает отлично, но в связи со значительной длительностью выполнения запроса хотелось бы зарядить запрос через поток, чтобы приложение не висло и не вводило пользователя в ступор.
Тестовый вариант выглядит так:
Код

// Поток
unit DBThread;

interface

uses
  Classes, DB;

type
  TForm = procedure of object;

type
  TDBThread = class(TThread)
  private
    vDataSet: TDataSet;
    vForm: TForm;
  protected
    procedure ActiveQuery(vDataSet: TDataSet);
    procedure Execute; override;
  public
    constructor MyCreate(fDataSet: TDataSet);
    property fForm: TForm write vForm;
  end;

implementation

{ TDBThread }

constructor TDBThread.MyCreate(fDataSet: TDataSet); begin
  inherited Create(True);
  FreeOnTerminate := True;
  Self.Priority := tpLower;
  vDataSet := fDataSet;
end;

procedure TDBThread.ActiveQuery(vDataSet: TDataSet);
begin
  vDataSet.Open;
end;

procedure TDBThread.Execute;
begin
  ActiveQuery(vDataSet);
  Synchronize(vForm);
end;

end.

// Форма
type
  TmyForm = class(TForm)

  cdsTer: TClientDataSet;

  private
    procedure LocateTer;

  end;

var
  myForm: TmyForm;

implementation

uses dbThread;
var dbThread: TDBThread;

procedure TmyForm.LocateTer;
begin
  cdsTer.Locate('TER_ID', '1234567890', [loPartialKey]);
end;

procedure TmyForm.FormShow(Sender: TObject);
begin
  dbThread := TDBThread.MyCreate(cdsTer);
  try
    dbThread.fForm := LocateTer;
    dbThread.Resume;
  except on EConvertError do
    begin
      dbThread.Free;
      ShowMessage('Ошибка приложения.');
    end;
  end;

end;


Так выглядит работа с потоком.
Поток инициализируется, выполняется, и на форме (через дебагер) выходит сообщение об ошибке:
Project MyProject.exe raised exception class ESocketConnectionError with message ‘Error reading from socket’.
Кстати, если смотреть пошагово, то до выполнения Synchronize(vForm) дело не доходит.
После выполнения vDataSet.Open форма отображается на экране (данные запроса должны отображаться через грид), затем задержка (выполнение запроса, я полагаю) и далее сообщение об ошибке.
Что не так делаю?
Спасибо.
За примеры отдельный респект и уважуха.

Автор: bartram 22.8.2009, 17:42
Рекомендую почитать вот http://forum.vingrad.ru/forum/topic-60076.html, сразу найдете свои ошибки.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)