Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.037 c
15-1154073368
NeyroSpace
2006-07-28 11:56
2006.08.27
Нужна программакоторая может организовать аудиовидео конференцию


15-1154079661
Думкин
2006-07-28 13:41
2006.08.27
Пятница...


1-1153251715
Gloomer
2006-07-18 23:41
2006.08.27
Как перекодировать строку из UTF-8 в ANSI?


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


2-1154439394
RomanH
2006-08-01 17:36
2006.08.27
Навигация по НД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский