![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TList vs TThreadList [D7, XP]
дед Маздай © (2009-02-04 10:16:00)Что использовать в потоке из сабжа? Приватное свойство потока.
Сергей М. (2009-02-04 12:06:00) [1]
> Видимо нет
Ну тогда без синхронизации не обойтись.
Либо TThreadList либо его эквивалент а-ля [3]
дед Маздай (2009-02-04 11:59:00) [2]
> MBo © (04.02.09 10:36) [1]
Что-то, типа, того (как-то так... пока писал сам немного запутался):
(Писал прямо здесь, так что, возможны ошибки, но общий смысл, думаю, ясен)
TSomeClass = Class(TThread)
private
FSomeList: array of TSomeSLList;
public
property SomeList[Index: Integer]: TSomeSLList read GetSomeList write SetSomeList;
end;
TSomeSLList = Class(TList) // или TThreadList
public
// методы сэйва и лоада
// основной поток
SomeClass := TSomeClass.Create;
SomeClass.SomeList[0].Item[0].Add...
SomeClass.SomeList[0].Item[1].Add...
SomeClass.SomeList[0].Item[2].Add...
SomeClass.SomeList[0].SaveToFile...
TSomeClass имеет свою очередь сообщений! Работа со свойствами в TSomeClass происходит в крит.секции. Добавляю TSomeSLList... Пытаюсь добавить =)
TSomeSLList еще не написан. Проектирую. ;)
> Сергей М. © (04.02.09 10:42) [2]
> Если предполагается
Видимо нет.
> Ega23 © (04.02.09 10:48) [3]
Приму к сведению. Спасибо.
Ega23 (2009-02-04 10:48:00) [3]
> Приватное свойство потока.
Если приватное свойство потока и в нём хранится данные, использующиеся только в это потоке - то TList.
Если к хранящимся данным идёт обращение из разных потоков - то я тоже обёртку над TList предпочту. С методами Lock и Unlock. Что-то типа:
TMyList = class (TList)
private
FCrit : TRTLCriticalSection;
public
constructor Create;
destructor Destroy; override;
procedure Lock;
procedure Unlock;
end;
constructor TMyList.Create;
begin
inherited Create;
InitializeCriticalSectionAndSpinCount(FCrit, 4000);
end;
destructor TMyList.Destroy;
begin
DeleteCriticalSection(FCrit);
inherited;
end;
procedure TMyList.Lock;
begin
EnterCriticalSection(FCrit);
end;
procedure TMyList.Unlock;
begin
LeaveCriticalSection(FCrit);
end;
Ну и обращаться к нему:
list.Lock;
try
// Работаем с данными
finally
list.Unlock;
end;
Сергей М. (2009-02-04 10:42:00) [4]
> Приватное свойство потока
Если предполагается, что доступ к этому св-ву будет осуществляться только в контексте данногопотока, то достаточно TList
MBo (2009-02-04 10:36:00) [5]задачу опиши, так непонятно