| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Ждать пока не освободится файл |
| Автор: Goganchic 9.10.2008, 18:49 |
| Всем привет! Пишу несложное приложение для ОС Windows, приложение время от времени может открывать файл на добавление и писать туда данные. Приложение может быть запущено в нескольких экземплярах, соответственно возможна ситуация, что два приложения обращаются к одному и тому же файлу, таким образом возникает конфликт и одно из приложений при попытке вызова функции fopen получит в ответ null. Вопрос такой: можно ли как-то реализовать такую логику: приложение пытается открыть файл и если он занят - оно ждет пока файл не освободится? Может есть какие-то стандартные функции? Заранее спасибо за ответы |
| Автор: 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 тогда все приложения смогут в него писать. |