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


Автор: gashik 11.8.2011, 18:43
Есть следующий код
Код

unit MainServer;
...
procedure TMainForm.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);

var
  path:string;
  NewThread:TerminalTread;
  ThreadID:cardinal;
begin
    if ARequestInfo.Params.Values['Action']='Update' then
    begin
        NewThread:=TerminalTread.Create(false);
        NewThread.WaitFor;
        AResponseInfo.ContentText:='Ok';
    end;
end;


Код

unit ServerTread;
   ...
type
  KotInfo = record
   ctm          :  TDateTime;    
   open         :  double;
   low          :  double;
   high         :  double;
   close        :  double;
   vol          :  integer;
  end;

type
  TerminalTread = class(TThread)

  private
    Fkk:integer;
    Fxxx:Array[0..100] of KotInfo;
  protected
    procedure UpdateM1;
    procedure Execute; override;
  end;
   ...
implementation
  uses SysUtils, MainServer;
  ....
procedure TerminalTread.UpdateM5;
var
  i:Integer;
begin

  MainForm.IBQuery1.Close;
  for i:=0 to Fkk-1 do
  begin
    with MainForm.IBQuery1 do begin
          SQL.Clear;
          SQL.Add('INSERT INTO '+Fquote+'_QUOTE '+
               'VALUES (:DATES,:ACCOUNT_ID,:SYMBOL_ID,:OPEN,:LOW,:HIGH,:CLOSE,:VOLUME)');

          Params[0].AsDateTime :=Fxxx[i].ctm;
          Params[1].AsInteger :=1;
          Params[2].AsInteger :=1;
          Params[3].AsFloat :=Fxxx[i].open;
          Params[4].AsFloat :=Fxxx[i].low;
          Params[5].AsFloat :=Fxxx[i].high;
          Params[6].AsFloat :=Fxxx[i].close;
          Params[7].AsInteger :=Fxxx[i].vol;
          ExecSQL;
          Close;
      end;
  end;
end;
end;
procedure TerminalTread.Execute;
begin
  Start();

  Fquote:=TABLE_M1;
  Fkk:=HistoryKot('GBPUSD',PERIOD_M1,100,Fxxx); //эта функция возвращает массив из 100 элементов типа KotInfo;
  Synchronize(UpdateM1);

end;

end.

Так вот, после запроса запускаеться тред, в котором выполняться код, но почему-то количество записей в базе становиться порядка, верней даже (+/- 100) , 6358. Записи дублируються 4 раза и очень много с нулевыми значениями (в передаваемом процедуре массиве нулевых значений нет). Заметил, что при отправке запроса серверу,  IdHTTPServer1CommandGet, создает два потока, хотя поток с обработкой данных, вроде бы один.
Подскажите, что в коде вызывает повторно процедуру Synchronize(UpdateM1); и как избавиться от дублирующихся записей и нулей?

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