Главная страница
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.059 c
2-1175511389
DelphiLexx
2007-04-02 14:56
2007.04.22
Правильно обработать OnCreate при динамическом создании формы


2-1175751344
vitv
2007-04-05 09:35
2007.04.22
Переброска данных с одной базы в другую


15-1175156627
Cyrax
2007-03-29 12:23
2007.04.22
Как проще всего сдвинуть звук в mpeg-файле ?


15-1175065611
Kerk
2007-03-28 11:06
2007.04.22
Интернет-форум как виртуальный аналог психодинамической группы


2-1175270259
Dmitry_177
2007-03-30 19:57
2007.04.22
переменная SYSTEMTIME определить что она пустая