Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Alexey (AZ) ©   (2007-04-01 18:41:00) 

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

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


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

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


Desdechado   (2007-04-01 21:55:00) [2]

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


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


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

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


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

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


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


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

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


Desdechado   (2007-04-01 19:08:00) [6]

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


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

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


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

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


Anatoly Podgoretsky   (2007-04-01 18:43:00) [9]

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо