Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Общая переменная для потоков 
V
    Опции темы
Витаминка
Дата 12.9.2007, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: нет
Всего: 1



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

Это сообщение отредактировал(а) Витаминка - 12.9.2007, 19:36
PM MAIL   Вверх
Alexeis
Дата 12.9.2007, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
EvilsInterrupt
Дата 12.9.2007, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



Витаминка, Этот вопрос, хорошо освещен в мануале от SAP (Петрович). Я читаю его и там довольно таки здорово все это дело расписано ;)
PM MAIL WWW ICQ Jabber   Вверх
Esperito
Дата 12.9.2007, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 2.9.2007

Репутация: нет
Всего: 3



В threadvar объявляется переменная, значение которой для каждого потока будет своё. А вот обычная глобальная переменная var будет общей.
PM MAIL   Вверх
MetalFan
Дата 12.9.2007, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



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

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


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Esperito
Дата 12.9.2007, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 2.9.2007

Репутация: нет
Всего: 3



Цитата(MetalFan @ 12.9.2007,  20:26)
но не потокобезопасной

Совершенно верно.
Однако неясно, что именно нужно автору smile
PM MAIL   Вверх
Витаминка
Дата 13.9.2007, 03:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: нет
Всего: 1



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

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

Именно такая, но потокобезопасная. Если я возьму запись значения этой переменной в критическую секцию, она станет такой?
PM MAIL   Вверх
Felan
Дата 13.9.2007, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



Обязательно! smile

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

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


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
Витаминка
Дата 13.9.2007, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: нет
Всего: 1



Цитата(Felan @ 13.9.2007,  07:18)
Обязательно! smile

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

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

Чуть проще пожалуста smile Можно с примером, что очень кстати
PM MAIL   Вверх
Felan
Дата 13.9.2007, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



Эх... да куда уж проще 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;




--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
MetalFan
Дата 13.9.2007, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



както так:
Код

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...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Витаминка
Дата 13.9.2007, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: нет
Всего: 1



О, спасибки! Этих примеров мне вполне хватит smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0950 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.