Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.09;
Скачать: 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 вся ветка

Текущий архив: 2005.10.09;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.03 c
14-1126765256
raymond
2005-09-15 10:20
2005.10.09
Ужас! Дожились...


4-1123829294
Mickey Mouse
2005-08-12 10:48
2005.10.09
IrDA и Bluetooth в Delphi


2-1125496160
Гость22
2005-08-31 17:49
2005.10.09
Как проверить, доступна ли сетевая папка?


14-1127210398
ПЛОВ
2005-09-20 13:59
2005.10.09
Напомните...


4-1123689747
Bios_
2005-08-10 20:02
2005.10.09
Обои