Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ждать пока не освободится файл, Как? 
:(
    Опции темы
Goganchic
Дата 9.10.2008, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 678
Регистрация: 18.6.2004

Репутация: нет
Всего: 5



Всем привет!
Пишу несложное приложение для ОС Windows, приложение время от времени может открывать файл на добавление и писать туда данные. Приложение может быть запущено в нескольких экземплярах, соответственно возможна ситуация, что два приложения обращаются к одному и тому же файлу, таким образом возникает конфликт и одно из приложений при попытке вызова функции fopen получит в ответ null. Вопрос такой: можно ли как-то реализовать такую логику: приложение пытается открыть файл и если он занят - оно ждет пока файл не освободится? Может есть какие-то стандартные функции?
Заранее спасибо за ответы smile
PM Jabber   Вверх
SaDFromSpb
Дата 9.10.2008, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 5.4.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 3



Ну самое простое - открывать его в цикле до тех пор, пока значение, выдаваемое fopen, не станет отличным от NULL.
Внутри цикла поставить sleep на несколько миллисекунд, чтоб проц не отжирало.
А вообще в винде должны быть механизмы синхронизации для таких случаев, наверно. Это пусть системщики подскажут.


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
Goganchic
Дата 11.10.2008, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 678
Регистрация: 18.6.2004

Репутация: нет
Всего: 5



SaDFromSpb, делать эту штуку в цикле - это ужасно, мне кажется что должно быть какое-то решение.
PM Jabber   Вверх
Earnest
Дата 11.10.2008, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Посмотри в сторону WaitForMultipleObjectsEx и Read\WriteFileEx.


--------------------
...
PM   Вверх
ama_kid
Дата 11.10.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 5
Всего: 95



Goganchic, как вариант - попробуй при перед открытием файла захватывать какой-нибудь расшаренный объект синхронизации (например, мьютекс), а при завершении работы с файлом - освобождай его. Ну и соответственно жди этот объект, если он занят...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
jonie
Дата 12.10.2008, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



имхо ama_kid самый правильный...
правда есть еще варианты:
поглядеть как сделано в COM STA. кратко: там очередь записи делается через скрытое окно - оконными сообщениями. соответственно делаем сервер, которому шлем данные, а уже он их пишет (данные можно через пайпы\сеть\окна\и т.п. бросать - в общем где есть очередь "не наша" 8-)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Dem_max
Дата 13.10.2008, 05:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Открывай файл с ключем FILE_SHARE_WRITE тогда все приложения смогут в него писать.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0541 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.