Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

многопоточный доступ к файлу


joo ©   (2006-08-07 17:19:00) 

Программа использует большой текстовый файл, с примерным содержанием:
param;param;param...
param;param;param...
param;param;param...


Интересует, как лучше и быстрее организовывать доступ к этому файлу, если в программе сразу несколько потоков будет пытаться открыть, прочитать, записать в файл. Я думаю, что надо каким-то образом блокировать файл при доступе из какого-то потока, а по завершении, разблокировать, дабы дать возможность остальным потоком взаимодействовать с файлом.
Возможные варианты взаимодействия -- это: удаление строки, добавление строки, перезапись строки.

Вот и интересует как лучше и быстрее, какие лучше файловые ф-ии использовать из delphi? или сразу на api?


DiamondShark   (2006-08-08 11:39:00) [1]

Написать обёртку


TFileAccessor = class
private
 FHandle: THandle;
 FSynchronizer: TMultiReadExclusiveWriteSynchronizer;
 ...
public
 procedure ReadLine(...);
 procedure WriteLine(...);
end;

...

procedure TFileAccessor.ReadLine;
begin
 FSynchronizer.BeginRead;
 try
   // ...
 finally
   FSynchronizer.EndRead;
 end
end;

procedure TFileAccessor.WriteLine;
begin
 FSynchronizer.BeginWrite;
 try
   // ...
 finally
   FSynchronizer.EndWrite;
 end
end;


Пусик   (2006-08-08 10:14:00) [2]


> Joe_from_smart   (08.08.06 01:38) [3]
> Добавлю, что блокировать нужно только на время записи, чтение
> можно оставить в покое :)


Это вряд ли.


Joe_from_smart   (2006-08-08 01:38:00) [3]

Добавлю, что блокировать нужно только на время записи, чтение можно оставить в покое :)


clickmaker   (2006-08-07 17:25:00) [4]

ну апи хоть иногда всего на несколько милисек, но по-любому быстрей.
для разделения доступа лучше TcriticalSection - самый быстрый из всех объектов синхронизации
CS.Enter;
try
 // что-то делаешь с файлом
finally
 CS.Leave;
end;

для ускорения лучше файл открыть один раз и держать открытым (если возможно)


Сергей М.   (2006-08-07 17:23:00) [5]


> или сразу на api?


Это еще зачем ?)


Наверх

Титульная страница Поиск, карта сайта Написать письмо