Главная страница
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.045 c
15-1154175086
Piter
2006-07-29 16:11
2006.08.27
Выбор цветов для рисования


6-1144449490
vagra
2006-04-08 02:38
2006.08.27
Узнать IP по имени домена


9-1133327946
Da Stranger
2005-11-30 08:19
2006.08.27
Про стрельбу


1-1152901145
Vetas
2006-07-14 22:19
2006.08.27
как отловить закрытие приложения из DLL


15-1154237704
Alert2006
2006-07-30 09:35
2006.08.27
PhotoShop