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


Автор: Витаминка 12.9.2007, 19:35
Простите за глупый вопрос, но как создать общую переменную для всех потоков приложения?

Автор: Alexeis 12.9.2007, 19:40
Да вроде не глупый. Такие переменные объявляются в специальной секции - ThreadVar

Автор: EvilsInterrupt 12.9.2007, 20:08
Витаминка, Этот вопрос, хорошо освещен в мануале от SAP (Петрович). Я читаю его и там довольно таки здорово все это дело расписано ;)

Автор: Esperito 12.9.2007, 20:18
В threadvar объявляется переменная, значение которой для каждого потока будет своё. А вот обычная глобальная переменная var будет общей.

Автор: MetalFan 12.9.2007, 20:26
Цитата(Esperito @  12.9.2007,  20:18 Найти цитируемый пост)
А вот обычная глобальная переменная var будет общей. 

но не потокобезопасной

Автор: Esperito 12.9.2007, 22:34
Цитата(MetalFan @ 12.9.2007,  20:26)
но не потокобезопасной

Совершенно верно.
Однако неясно, что именно нужно автору smile

Автор: Витаминка 13.9.2007, 03:30
Цитата(Esperito @ 12.9.2007,  22:34)
Цитата(MetalFan @ 12.9.2007,  20:26)
но не потокобезопасной

Совершенно верно.
Однако неясно, что именно нужно автору smile

Именно такая, но потокобезопасная. Если я возьму запись значения этой переменной в критическую секцию, она станет такой?

Автор: Felan 13.9.2007, 07:18
Обязательно! smile

ЗЫЖ Только в этом случае лучше сделать класс в котором будет инкапсулирована эта переменная и в котором будет обеспечиваться потокобезопасноть.

Тогда можно будет, если что, без проблем добавить еще какую-нибудь переменную. Код, обеспечивающий потокобезопасность, будет в одном месте и в одном экземпляре. Намного проще поддержка.

Автор: Витаминка 13.9.2007, 08:05
Цитата(Felan @ 13.9.2007,  07:18)
Обязательно! smile

ЗЫЖ Только в этом случае лучше сделать класс в котором будет инкапсулирована эта переменная и в котором будет обеспечиваться потокобезопасноть.

Тогда можно будет, если что, без проблем добавить еще какую-нибудь переменную. Код, обеспечивающий потокобезопасность, будет в одном месте и в одном экземпляре. Намного проще поддержка.

Чуть проще пожалуста smile Можно с примером, что очень кстати

Автор: Felan 13.9.2007, 08:17
Эх... да куда уж проще smile

Вот пример.
Доступ к переменной fSecondaryPayOnlyHrefStart только через потокобезопасные методы.

Код

type
  TiaSKS_Config = class (TInterfacedObject)
  private
    function getSecondaryPayOnlyHrefStart: string;
    procedure setSecondaryPayOnlyHrefStart(const Value: string);
  protected
    fCS_GetSet: TCriticalSection;
    fSecondaryPayOnlyHrefStart: string;
  public
    constructor Create(); virtual;
    destructor Destroy(); override;
  published
    property SecondaryPayOnlyHrefStart: string read getSecondaryPayOnlyHrefStart write setSecondaryPayOnlyHrefStart;
  end;


Код

constructor TiaSKS_Config.Create;
begin
  fCS_GetSet := TCriticalSection.Create;

  fRW := TiaRegistryWorker.Create(DEF_SKS_REGISTRY_ROOT, DEF_SKS_REGISTRY_SUBKEY, DEF_SKS_PROGRAM_SUBKEY);

  SetDefault;
end;

destructor TiaSKS_Config.Destroy;
begin
  FreeAndNil(fCS_GetSet);

  inherited;
end;

procedure TiaSKS_Config.setSecondaryPayOnlyHrefStart(const Value: string);
begin
  fCS_GetSet.Enter;

  fSecondaryPayOnlyHrefStart :=  Value;

  fCS_GetSet.Leave;
end;

function TiaSKS_Config.getSecondaryPayOnlyHrefStart: string;
begin
  fCS_GetSet.Enter;

  Result := fSecondaryPayOnlyHrefStart;

  fCS_GetSet.Leave;
end;


Автор: MetalFan 13.9.2007, 08:26
както так:
Код

uses SyncObjs;

var
  GVar: Integer;
  GLockCS: TCriticalSection;

procedure InitCS;
begin
  GLockCS := TCriticalSection.Create;
end;

procedure ReleaseCS;
begin
  GLockCS.Free;
end;

procedure EnterCS;
begin
  GLockCS.Enter;
end;

procedure LeaveCS;
begin
  GLockCS.Leave;
end;

function GetVar: Integer;
begin
  EnterCS;
  try
    Result := GVar;
  finally
    LeaveCS;
  end;
end;

procedure SetVar( AVal: Integer );
begin
  EnterCS;
  try
    GVar := AVal;
  finally
    LeaveCS;
  end;
end;

initialization
  InitCS;
finalization
  ReleaseCS;
end.


и вообще советую посмотреть обертки в SyncObjs...

Автор: Витаминка 13.9.2007, 11:58
О, спасибки! Этих примеров мне вполне хватит smile 

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