Использование критических секций
От: AMogil Россия  
Дата: 25.09.04 18:27
Оценка:
Здравствуйте.

Хотелось бы уточнить. Существует следующий класс, использующий дополнительную нить. Из этой нити необходимо вызывать метод данного класса:

Класс:

TMainClass = class(TInterfacedObject)
private
  FCommandText: WideString;
  FCriticalSection: TCriticalSection;
  FThreadClass: TThreadClass;
public
  constructor Create; virtual;
  destructor Destroy; override;

  function GetCommandText: WideString; overload;
  procedure SetCommandText(const Value: WideString);
end;
    
...
    
constructor TMainClass.Create;
begin
  inherited;
  FCriticalSection := TCriticalSection.Create;
  FThreadClass := TThreadClass.Create(Self);
  SetSQLCommandText('ddd');
  FThreadClass.Resume;    
end;
    
function TMainClass.GetCommandText: WideString;
begin
  FCriticalSection.Enter;
  try
    Result := FCommandText;
  finally
    FCriticalSection.Leave;
  end;
end;

procedure TMainClass.SetCommandText(const Value: WideString);
begin
  FCriticalSection.Enter;
  try
    FCommandText := Value;
  finally
    FCriticalSection.Leave;
  end;
end;

Нить:
    
TThreadClass = class(TThread)
protected
  FOwner: TObject;
  procedure Execute; override;
public
  constructor Create(Owner: TObject); virtual;
  destructor Destroy; override;
end;
    
...
    
constructor TThreadClass.Create(Owner: TObject);
begin
  inherited Create(True);
  FOwner := Owner;
  FreeOnTerminate := False;
end;
    
procedure TDatabaseConnectionThread.Execute;
var
  S: WideString;
begin
  S := TMainClass(FOwner).GetCommandText;
  ...
end;



Суть вопроса: корректно ли такое использование критической секции? Просто справка Delphi говорит, что

Critical sections must be global in scope so that they are available to all threads


Но в данном случае нить не видит объект критической секции.

Алексей.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.