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

Вниз

Дважды открыть файл (RW и R режимы).   Найти похожие ветки 

 
Alexey (AZ)   (2007-04-01 18:41) [0]

Здравствуйте.
Возникла небольшая заминка по поводу совместного использования доступа. Открываю файл ч/з :
TFileStream.Create(DBName,fmOpenReadWrite,fmShareDenyRead);
Так файл пишется, а затем его же из этого же приложения надо быстро читать и поэтому использую TMemoryStream.LoadFromFile, но делфи страшно ругается. Сейчас поясню зачем так. Нужно постепенно записывать в файл понемногу ч/з определенные промежутки времени, а затем быстро переиндексировать содержимое, тоже в опр. моменты времени, но не синхронно, т.е. в одном потоке. Соответственно, ничего лучше чем загрузить разом в MemoryStream и по-быстрому перечитать там его, я не придумал.

Предложите плз человеческие методы. В несколько строк желательно, дабы без извратов. BDS2006, TurboDelphi. Кстати, справка в нем - гуано.


 
Anatoly Podgoretsky ©   (2007-04-01 18:43) [1]

> Alexey (AZ)  (01.04.2007 18:41:00)  [0]

Ты сам запретил его читать - fmShareDenyRead


 
Alexey (AZ)   (2007-04-01 18:51) [2]

Извините, просто ошибся. Конечно же fmShareDenyWrite там должно быть. результат тот же =( Ошибки доступа.


 
Alexey (AZ)   (2007-04-01 18:58) [3]

GetLastError сообщает ERROR_SHARING_VIOLATIONS =(


 
Desdechado ©   (2007-04-01 19:08) [4]

> тоже в опр. моменты времени, но не синхронно, т.е. в одном потоке.
Закрываешь первый, открываешь второй.
Хотя для fmOpenReadWrite это не нужно. Можешь прямо в нем опять перечитывать и "индексировать".


 
Anatoly Podgoretsky ©   (2007-04-01 19:14) [5]


> GetLastError сообщает ERROR_SHARING_VIOLATIONS =(

Значит открывается в режиме чтения/записи, если вообще не монопольно.


 
Alexey (AZ)   (2007-04-01 19:16) [6]

Дело в том, что затребовать этот файл из одного потока могут разные объекты - один будет только записывать, другой - только читать. Причем, эти объекты ничего не знают о существовании друг друга. А открывать для объекта1 и закрывать, а затем открывать для объекта2 и закрывать* и так в цикле по 100 раз на секунду, это не эффективно.
*Т.е. объект1 всегда _держит_ файл открытым и пишет, а объект 2 мгновенно считывает (т.к. унаследован от TMemoryStream) и соответственно _не_держит_ файл.


 
Alexey (AZ)   (2007-04-01 19:18) [7]


> Anatoly Podgoretsky ©   (01.04.07 19:14) [5]

К сожалению отладка подтверждает, что:
Access = GENERIC_READ|GENERIC_WRITE
ShareMode = FILE_SHARE_READ
Mode = OPEN_EXISTING


 
Desdechado ©   (2007-04-01 21:55) [8]

>  но не синхронно, т.е. в одном потоке.
>  всегда _держит_ файл открытым и пишет,
Где правда?
Эти 2 мысли противоречат друг другу.


 
Alexey (AZ)   (2007-04-02 14:29) [9]

Нет. Вот так:
for ... do begin
Обект1-> пишет.
Объект2->читает.
end;
Каждый объект держит свой файл. Открывать и закрывать для каждого объекта не желательно.
Т.е. упростим задачу. Можно не открывать файл повторно, а как-то указать что файл открыт и из него можно читать.



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

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

Наверх




Память: 0.49 MB
Время: 0.041 c
15-1175077376
atruhin
2007-03-28 14:22
2007.04.22
Как перенести данные Outlook 2003


15-1174736919
Kostafey
2007-03-24 14:48
2007.04.22
Порекомендуйте как правильно организовать GUI


3-1170409106
Монг
2007-02-02 12:38
2007.04.22
Не удаляеться строчка


2-1175164361
YadlU
2007-03-29 14:32
2007.04.22
Дата время


2-1175246658
VEZ
2007-03-30 13:24
2007.04.22
F1