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

Вниз

Дважды открыть файл (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.055 c
3-1170212620
Flagman
2007-01-31 06:03
2007.04.22
Вычленить время из TIMESTAMP (Oracle)


2-1175328074
DeadTeachers
2007-03-31 12:01
2007.04.22
Как сохранить ссылки?


15-1175172963
ProgRAMmer Dimonych
2007-03-29 16:56
2007.04.22
Стесняюсь спросить (С) Староконь... :)


4-1164626298
jiny
2006-11-27 14:18
2007.04.22
Проблема с ANI-курсорами (при извлечении из ресурса)


2-1175681860
Sonia
2007-04-04 14:17
2007.04.22
Из января вычесть месяц





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский