Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Ждать пока не освободится файл


Автор: Goganchic 9.10.2008, 18:49
Всем привет!
Пишу несложное приложение для ОС Windows, приложение время от времени может открывать файл на добавление и писать туда данные. Приложение может быть запущено в нескольких экземплярах, соответственно возможна ситуация, что два приложения обращаются к одному и тому же файлу, таким образом возникает конфликт и одно из приложений при попытке вызова функции fopen получит в ответ null. Вопрос такой: можно ли как-то реализовать такую логику: приложение пытается открыть файл и если он занят - оно ждет пока файл не освободится? Может есть какие-то стандартные функции?
Заранее спасибо за ответы smile

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

Автор: Goganchic 11.10.2008, 10:19
SaDFromSpb, делать эту штуку в цикле - это ужасно, мне кажется что должно быть какое-то решение.

Автор: Earnest 11.10.2008, 14:16
Посмотри в сторону WaitForMultipleObjectsEx и Read\WriteFileEx.

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

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

Автор: Dem_max 13.10.2008, 05:45
Открывай файл с ключем FILE_SHARE_WRITE тогда все приложения смогут в него писать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)