Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.27;
Скачать: CL | DM;

Вниз

многопоточный доступ к файлу   Найти похожие ветки 

 
joo   (2006-08-07 17:19) [0]

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


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

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


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


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


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


 
clickmaker ©   (2006-08-07 17:25) [2]

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

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


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

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


 
Пусик ©   (2006-08-08 10:14) [4]


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


Это вряд ли.


 
DiamondShark ©   (2006-08-08 11:39) [5]

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


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;



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

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

Наверх




Память: 0.48 MB
Время: 0.033 c
15-1154422757
cyborg
2006-08-01 12:59
2006.08.27
В этом году жёсткому диску исполнится 50 лет


6-1144603398
Izolda
2006-04-09 21:23
2006.08.27
Поисковая система


2-1154596971
lorn
2006-08-03 13:22
2006.08.27
XML ->PARSER


6-1144309337
DVM
2006-04-06 11:42
2006.08.27
Как замедлить прием данных с сервера HTTP


1-1152522186
97
2006-07-10 13:03
2006.08.27
JvSearchFiles из Jedi