Совместное использование темы Thread - PullRequest
0 голосов
/ 08 мая 2018

Мой класс унаследован от TThread с несколькими свойствами, одним из которых является TAdoDataSet. Мой поток создает свой собственный TAdoConnection и TAdoDataSet. Мои вопросы: 1- безопасно ли использовать DataSet (MyThread.dataset) в главном потоке ПОСЛЕ прекращения MyThread? 2 - есть ли лучший метод для реализации этого требования? Я имею в виду создание потока, который открывает набор данных, а затем использует набор данных в основном потоке? Функция CAllBack или PostMessage?

TmyProc =Procedure (Msg:TmyMsg) of object;

  TmyThread = Class(TThread)
  private
    FConnection: TAdoConnection;
    FMyDataset :TAdoDataSet;
    FmyProc: TMyProc;
  protected
    procedure Execute; override;
    property myProc: TmyProc read FmyProc;
  public
    Constructor Create(myProc:TmyProc;
                      ConnectionString: WideString);
    property MyDataSet: TAdoDataSet read FMyDataset 
  end;

constructor TmyThread .Create(Susp:Boolean; myProc:TmyProc; 
   ConnectionString: WideString);
begin

// here I create the connection and mydataset;
// and my callback comes from main thread;
FmyProc := myProc; 

inherited Create(Susp);
end;


procedure TmyThread.Execute;
begin
  inherited;
  CoInitialize(nil);
  // here I open the connection and myDataset
  CoUninitialize();
end;


In the main thread :

procedure TForm1.Button1Click(Sender: TObject);
begin
  mt:=TmyThread.Create(True,ACallBack,ADOConnection1.ConnectionString);
  mt.FreeOnTerminate := True;
  mt.OnTerminate:= OnThredDone;
  mt.Resume;
end;

3 - Как вы видите в коде выше, freeonterminate: = True, но MyThread остается в живых, когда я тестирую его, используя: if Assigned (MyThread).

1 Ответ

0 голосов
/ 12 мая 2018

Это не потокобезопасно. В Дельфи звонок

Назначено (MyThread)

просто тесты на ноль. Это так же, как

ноль <> MyThread

Однако в Delphi вызов Free для объекта не устанавливает указатель объекта на ноль.

MyThread.Free;
if Assigned(MyThread) then  //this will return true
begin
  MyThrerad.MyDaSet.First; //and this will give you an access violation!
end;

Delphi имеет встроенную процедуру FreeAndNil, которая гарантирует, что указатель объекта установлен в ноль. Люди должны использовать это.

...