![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Goganchic |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 678 Регистрация: 18.6.2004 Репутация: нет Всего: 5 |
Всем привет!
Пишу несложное приложение для ОС Windows, приложение время от времени может открывать файл на добавление и писать туда данные. Приложение может быть запущено в нескольких экземплярах, соответственно возможна ситуация, что два приложения обращаются к одному и тому же файлу, таким образом возникает конфликт и одно из приложений при попытке вызова функции fopen получит в ответ null. Вопрос такой: можно ли как-то реализовать такую логику: приложение пытается открыть файл и если он занят - оно ждет пока файл не освободится? Может есть какие-то стандартные функции? Заранее спасибо за ответы |
|||
|
||||
| SaDFromSpb |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 5.4.2006 Где: Санкт-Петербург Репутация: нет Всего: 3 |
Ну самое простое - открывать его в цикле до тех пор, пока значение, выдаваемое fopen, не станет отличным от NULL.
Внутри цикла поставить sleep на несколько миллисекунд, чтоб проц не отжирало. А вообще в винде должны быть механизмы синхронизации для таких случаев, наверно. Это пусть системщики подскажут. -------------------- "За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001) |
|||
|
||||
| Goganchic |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 678 Регистрация: 18.6.2004 Репутация: нет Всего: 5 |
SaDFromSpb, делать эту штуку в цикле - это ужасно, мне кажется что должно быть какое-то решение.
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Посмотри в сторону WaitForMultipleObjectsEx и Read\WriteFileEx.
-------------------- ... |
|||
|
||||
| ama_kid |
|
|||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 5 Всего: 95 |
Goganchic, как вариант - попробуй при перед открытием файла захватывать какой-нибудь расшаренный объект синхронизации (например, мьютекс), а при завершении работы с файлом - освобождай его. Ну и соответственно жди этот объект, если он занят...
-------------------- самурай без меча подобен самураю с мечом, но только без меча |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
имхо ama_kid самый правильный...
правда есть еще варианты: поглядеть как сделано в COM STA. кратко: там очередь записи делается через скрытое окно - оконными сообщениями. соответственно делаем сервер, которому шлем данные, а уже он их пишет (данные можно через пайпы\сеть\окна\и т.п. бросать - в общем где есть очередь "не наша" 8-) -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Открывай файл с ключем FILE_SHARE_WRITE тогда все приложения смогут в него писать.
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |