Przekazanie do wątku ADOConnection

0

Witam szanownych forumowiczów,
mam następujący problem, chcę utworzyć wątek który będzie co określony interwał czasu zapisywał dane do bazy danych w programie mam jeden obiekt klasy TAdoConnection, chciałbym go przekazywać w czasie tworzenia nowego wątku jako parametr, robię z pewnością coś nie tak jak być powinno bo dostaję Access Violation, zamieszczam unit z całym kodem, bardzo bym prosił o sugestię jak rozwiązać ten problem.

unit xthread;

interface

uses
  Classes, ADODB, SysUtils;

type
  ThreadFotoSave = class(TThread)
  private
    { Private declarations }
    FADOConnection: TADOConnection;
    ADOQuery: TADOQuery;
  protected
    procedure Execute; override;
  public
    constructor Create(ADOConnection: TADOConnection);
    destructor Destroy; override;
  end;

implementation


constructor ThreadFotoSave.Create(ADOConnection: TADOConnection);
begin
  inherited Create(False);
  FreeOnTerminate := True;
  FADOConnection:=ADOConnection;
  ADOQuery.Create(nil);
  ADOQuery.Connection:=FADOConnection;
  ADOQuery.SQL.Add('insert into tab1 (czas)values(:CZAS)');
end;

destructor ThreadFotoSave.Destroy;
begin
  ADOQuery.Free;
  inherited;
end;

procedure ThreadFotoSave.Execute;
var
 I:integer;
begin
     ADOQuery.Close;
     ADOQuery.Parameters.ParamByName('CZAS').Value:=Date+Time;
     ADOQuery.ExecSQL;
end;

end.
0

być może błąd znajduje się w nieprawidłowym wywołaniu konstruktora

standardowo robi się to tak:

zmienna := typ_zmiennej.Create();

=)

0

jeśli chodzi o konstruktor klasy tego wątku to ja go specjalnie zmodyfikowałem i wywołuje go:

var
 ft:ThreadFotoSave;
begin
 ft:=ThreadFotoSave.Create(ADOConnection1);
end;

natomiast idąc krok po kroku program wywala mi sie w linijce ADOQuery.Connection:=FADOConnection;

0

ADO nie jest threadsafe więc nie możesz odwoływać się do obiektu ADO z innego wątku, niż wątek w którym został utworzony

0

Misiekd dziękuję za odpowiedź,
w takim razie jest jakieś rozwiązanie na mój problem, chciałem zachować obiekt ADOConnection z tego względu żeby do bazy było jedno połączenie a w jego ramach wiele sesji co zapewnia właśnie ADOConnection.

------------------Edit------------------------
Problem rozwiązany wystarczyło skorzystać Synchrinize w wątku.
Misiekd badzo dziękuje za podpowiedź, bo to właśnie ona naprowadziła mnie na rozwiązanie.
Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1