Вниз
Скачать: CL | DM;

TList не потоко-безопасный класс?   Найти похожие ветки 

← →
Piter ©   (2005-09-17 21:33) [0]

Вот какой глюк - если TList создавать в основном потоке, а записи добавлять в доп. потоках, то вылазят EAccessViolation... но с чего бы это? Доступ синхронизирую...

На примере:

 TPluginList = class
 private
   FList: TList;
   FCriticalSection: TCriticalSection;
 public
   constructor Create;
   destructor Destroy; override;
   procedure AddPlugin(ThreadId: Cardinal);
   procedure DeletePlugin(ThreadId: Cardinal);
   function ExistPlugin(ThreadId: Cardinal): boolean;
 end;

......

{*************** TPluginList ***************}

constructor TPluginList.Create;
begin
 Inherited;
 FCriticalSection := TCriticalSection.Create ;
end;

procedure TPluginList.AddPlugin(ThreadId: Cardinal);
begin
 FCriticalSection.Enter ;
 try
   if not ExistPlugin(ThreadId) then
     FList.Add(Pointer(ThreadId));
 finally
   FCriticalSection.Leave ;
 end;
end;

procedure TPluginList.DeletePlugin(ThreadId: Cardinal);
var
 i: integer;
begin
 FCriticalSection.Enter ;
 try
   i := FList.IndexOf(Pointer(ThreadId));
   if i>=0 then
     FList.Delete(i);
 finally
   FCriticalSection.Leave ;
 end;
end;

function TPluginList.ExistPlugin(ThreadId: Cardinal): boolean;
begin
 FCriticalSection.Enter ;
 try
   Result := FList.IndexOf(Pointer(ThreadId)) >= 0;
 finally
   FCriticalSection.Leave ;
 end;
end;

destructor TPluginList.Destroy;
begin
 FreeAndNil(FCriticalSection);
 inherited;
end;


Вроде по структуре TList это базовый класс, ничего за собой не тянет... почему же ошибки лезут...


← →
Sergey_Masloff   (2005-09-17 22:21) [1]

Естественно не потокобезопасный.  См.
TThreadList represents a thread-safe list.


← →
Piter ©   (2005-09-17 23:03) [2]

Нда... на свалку мне пора... ошибка в том, что я не создаю экземпляр FList :( Как я так лохануться мог...

Sergey_Masloff   (17.09.05 22:21) [1]
Естественно не потокобезопасный


ну понятно, но я ведь синхронизирую доступ, фактически сделал маленький аналог TThreadList. За подсказку спасибо - я и не знал о таком классе, тогда не буду изобретать велосипед...


← →
Sergey_Masloff   (2005-09-17 23:36) [3]

Piter ©   (17.09.05 23:03) [2]
Дя я код потом уже прочел ;-) Ответил фактически на заголовок.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.027 c
1-1127034318
Alexis
2005-09-18 13:05
2005.10.09
Парсинг алгебраических выражений (полиномов)


4-1123770298
NightLord
2005-08-11 18:24
2005.10.09
Обои в винде


1-1126776541
ORMADA
2005-09-15 13:29
2005.10.09
FastDIB


4-1123739802
Tupoy
2005-08-11 09:56
2005.10.09
Ярлыки на рабочем столе


14-1126797357
TStas
2005-09-15 19:15
2005.10.09
Вернуть файлы на место




   Наверх