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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> удаление строки и обновление(TStringList ) 
V
    Опции темы
eXa
Дата 9.8.2007, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Сдрасти! Как осуществить следующие... Есть список(TStringList) его обрабатывают n'ое кол-во потоков, при обращении потока к строке, строка должна удалиться, чтобы она небыла обработана ещё раз, как из TStringList удалить строку и потом обновить список и так пока список не закончится?
PM MAIL   Вверх
Snowy
Дата 9.8.2007, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Как, как... Синхронизировать...
PM MAIL   Вверх
Alexeis
Дата 9.8.2007, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Во первых сделать надстройку над классом, так чтобы одновременно к нему мог иметь доступ только 1 поток, во вторых при передаче строки по индексу нужно всегда возвращать копию строки, т.е. вызывать функцию copy() - и передавать только ту строку которую вернет функция copy() , иначе два потока получат указатель на одну и ту же строку, а это уже не допустимо, так как синхронизировать к ней доступ будет уже невозможно.


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

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

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


Шустрый
*


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

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



Разобрался, спасибо...
Snowy как ты будеш синхронизировать к примеру 100 потоков? O_o
Нарушу одно страшное правило этова форума, задам ещё один вапрос! smile 
Как правильно грузить из TMemo в TStringList, вроде как командой "Text" он должен грузить со всеми завершающими символами,  но не хочит...
Код

var
SP: TMemo
begin
 Ls:= TStringList.Create;
 Ls.Text(SP.Lines);

Как правильно?



Это сообщение отредактировал(а) eXa - 10.8.2007, 03:41
PM MAIL   Вверх
MetalFan
Дата 10.8.2007, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код

Ls.Assign(SP.Lines)



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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Цитата(eXa @  10.8.2007,  03:40 Найти цитируемый пост)
Snowy как ты будеш синхронизировать к примеру 100 потоков? O_o
А зачем тебе 100 потоков?
Если StringList не модифицируется, то просто заведи отдельную переменную-счётчик.
Каждый поток для получения очередной строки должен сделать 
Код

var
  i: integer;
  s: string;
begin
  i := InterlockedExchange(Schetchik, 1); // счётчик глобальный для всех тредов
  if i < strlist.Count then // strlist - твой StringList. Тоже глобальный для всех тредов
    s := srtlist[i]
  else Terminate;
Вот так ни один тред не возьмёт из списка строку дважды.
Единственное условие - не удалять строки из листа.
PM MAIL   Вверх
aktuba
Дата 10.8.2007, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


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

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



Цитата

Snowy как ты будеш синхронизировать к примеру 100 потоков? O_o


жэстоко.... очень...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
MetalFan
Дата 10.8.2007, 10:08 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



простейший потокобезопасный список строк можно нарисовать примерно так:
Код

interface

uses Classes, SyncObjs;

type
  TSafeStringList = class
  private
    FCS: TCriticalSection;
    FIntList: TStringList;
    function GetList: TStringList;
    function GetItem(AIndex: Integer): string;
    procedure SetItem(AIndex: Integer; const Value: string);
  public
    constructor Create;
    destructor Destroy; override;
    function Lock: TStringList;
    procedure Unlock;
    function Add( AItem: string ): Integer;
    procedure Delete( AIndex: Integer );
    property Items[ AIndex: Integer ]: string read GetItem write SetItem; default;
  end;

implementation

{ TSafeStringList }

function TSafeStringList.Add(AItem: string): Integer;
var
  lList: TStringList;
begin
  lList := Lock;
  try
   Result := lList.Add( AItem );
  finally
    Unlock;
  end;
end;

constructor TSafeStringList.Create;
begin
  FCS := TCriticalSection.Create;
end;

procedure TSafeStringList.Delete(AIndex: Integer);
var
  lList: TStringList;
begin
  lList := Lock;
  try
    lList.Delete(AIndex);
  finally
    Unlock;
  end;
end;

destructor TSafeStringList.destroy;
begin
  FCS.Free;
  FIntList.Free;
  inherited;
end;

function TSafeStringList.GetItem(AIndex: Integer): string;
var
  lList: TStringList;
begin
  lList := Lock;
  try
   Result := lList[AIndex];
  finally
    Unlock;
  end;

end;

function TSafeStringList.GetList: TStringList;
begin
  if not Assigned( FIntList ) then
    FIntList := TStringList.Create;
  Result := FIntList;
end;

function TSafeStringList.Lock: TStringList;
begin
  FCS.Enter;
  Result := GetList;
end;

procedure TSafeStringList.SetItem(AIndex: Integer; const Value: string);
var
  lList: TStringList;
begin
  lList := Lock;
  try
   lList[AIndex] := Value;
  finally
    Unlock;
  end;
end;

procedure TSafeStringList.Unlock;
begin
  FCS.Leave;
end;

по идее должно работать) но нужно его отладить)
можно и остальной функционал TStringList вынести "наверх"...

Это сообщение отредактировал(а) MetalFan - 10.8.2007, 10:10


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
StepRu
Дата 15.8.2007, 17:23 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



есть такая хрень, как симофоры, мьютексы и прочее. Кодиться за считанные секунды, зато не даёт доступ к критическим участкам, пока те не освободятся.
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.1008 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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