Форум: "Начинающим";
Текущий архив: 2008.01.20;
Скачать: [xml.tar.bz2];
Внизобщие ресурсы Найти похожие ветки
← →
niKo (2007-12-17 15:55) [0]подскажите пожалуста, каким образом предупредить одновременный доступ к одному и тому же ресурсу, нескольких запущенных копий одной и той же проги
для наглядности: запущенно до 5-ти копий проги, и все хотят одновременно писать или читать в один и тот же текстовый файл
спасиба
← →
clickmaker © (2007-12-17 16:00) [1]кто первый встал, того и тапки, что-ли?
← →
Джо © (2007-12-17 16:01) [2]> [0] niKo (17.12.07 15:55)
> подскажите пожалуста, каким образом предупредить одновременный
> доступ к одному и тому же ресурсу, нескольких запущенных
> копий одной и той же проги
> для наглядности: запущенно до 5-ти копий проги, и все хотят
> одновременно писать или читать в один и тот же текстовый
> файл
> спасиба
Открывать файл эксклюзивно?
← →
niKo (2007-12-17 16:02) [3]
> кто первый встал, того и тапки, что-ли?
да что-то в этом роде, а дальше тапки по очереди! :)
← →
Kolan © (2007-12-17 16:03) [4]Сервер БД?
← →
Юрий Зотов © (2007-12-17 16:06) [5]Семафор?
← →
DiamondShark © (2007-12-17 16:07) [6]А какие ресурсы-то?
Для файлов параметр dwShareMode в CreateFile передавать равным 0.
Для других типов ресурсов подход будет другой.
← →
ProgRAMmer Dimonych © (2007-12-17 16:07) [7]> niKo (17.12.07 15:55)
> подскажите пожалуста, каким образом предупредить одновременный
> доступ к одному и тому же ресурсу
Жёлтую карточку этому доступу :) Кстати, знаки препинания иногда очень сильно упрощают решение задачи :)
Если серьёзнее, то всё зависит от конкретной задачи. Приведу пример извращения, которое может быть идеальным в одних случаях и отвратительным в других...
Пишем программу, которая единственная будет обращаться к файлу, типа программа-сервер. Остальные программы (те, которых пять штук) просто обращаются к этой программе-серверу и просят: "Милостивая сударыня, не будете ли вы столь любезны...", а программа-сервер этот запрос помещает в очередь и реагирует, когда это надо.
В любом случае единственный вариант, который отсечёт все программы (не только Вашу), - это предложенный Джо © (17.12.07 16:01) [2].
Кстати, Вы часом не прогу для чата по локальной сети пишете?
← →
niKo (2007-12-17 16:41) [8]
> Пишем программу, которая единственная будет обращаться к
> файлу, типа программа-сервер
вариант очень хороший, но не выполнимо
> Кстати, Вы часом не прогу для чата по локальной сети пишете?
в таком случае использовал бы вариант первый
> Юрий Зотов © (17.12.07 16:06) [5]
>
> Семафор?
можна немного теории по использованию
я всегда при работе с потоками, но в одном приложении использовал свои флаги для управления доступом и работой потоков
интерисует только одно в принцыпе как выставить СЕМАФОР
← →
Юрий Зотов © (2007-12-17 16:52) [9]> niKo (17.12.07 16:41) [8]
http://msdn2.microsoft.com/en-us/library/ms685129.aspx
← →
Kolan © (2007-12-17 16:53) [10]> в принцыпе как выставить СЕМАФОР
MSDN в помошь …
← →
niKo (2007-12-17 17:07) [11]
> Юрий Зотов © (17.12.07 16:52) [9]
>
> > niKo (17.12.07 16:41) [8]
>
> http://msdn2.microsoft.com/en-us/library/ms685129.aspx
спасиба!
буду разбираться!
← →
niKo (2007-12-17 17:40) [12]вроде бы немного разобрался, подскажите если чего неправильно или как лучше сделать
Semaphore := CreateSemaphore(NIL,1,1,"semaphor");
WaitForSingleObject(Semaphore, INFINITE);
//доступ к общим ресурсам
ReleaseSemaphore(Semaphore, 1, NIL);
CloseHandle(Semaphore);
← →
Leonid Troyanovsky © (2007-12-17 17:44) [13]
> niKo (17.12.07 17:40) [12]
> или как лучше сделать
[2]
--
Regards, LVT.
← →
niKo (2007-12-17 18:25) [14]
> Джо © (17.12.07 16:01) [2]
> Открывать файл эксклюзивно?
нужно просто организовать задержку(очередь) пока другое приложение изменяет файл и сразу же после освобождения, получить управление для следующего и т.д. если есть очередь!
код [12] в самом простом варианте подойдет или нет? или ето вообще не код :)
← →
ProgRAMmer Dimonych © (2007-12-17 20:05) [15]> niKo (17.12.07 16:41) [8]
> > Пишем программу, которая единственная будет обращаться к
> > файлу, типа программа-сервер
> вариант очень хороший, но не выполнимо
Что и требовалось ожидать. :)
> > Кстати, Вы часом не прогу для чата по локальной сети пишете?
> в таком случае использовал бы вариант первый
Странно. Я бы в таком случае вообще файлов не использовал :)
=====
Ещё... Про эти Semaphore... Они во всех виндах поддерживаются?
← →
Loginov Dmitry © (2007-12-17 21:37) [16]> подскажите пожалуста, каким образом предупредить одновременный
> доступ к одному и тому же ресурсу, нескольких запущенных
> копий одной и той же проги
> для наглядности: запущенно до 5-ти копий проги, и все хотят
> одновременно писать или читать в один и тот же текстовый
> файл
> спасиба
Одновременно писать в один и тот же файл не получится (лучше этого не делать!), а одновременно читать - сколько угодно. Для записи открывать файл следует с атрибутом fmShareDenyWrite, для чтения - с fmShareDenyNone. Запись (а желательно также и чтение) следует защищать объектом синхронизации. Надежнее всего - с помощью мьютекса. Второй вариант - защитить запись в файл с помощью мьютекса, а чтение - с помощью семафора (чтобы ограничить количество клиентов, пытающихся одновременно прочитать файл). Но в последнем случае мы не можем определить размер файла (вернее не может полагаться, что результать функции GetFileSize будет актуален для следующей строки), и данные в файле могут измениться в любой момент времени. Таким образом: хочешь надежности - используй один мьютекс на запись в файл и на чтение. Хочешь производительности - защищай запись с файл мьютексом, а чтение - семафором.
Думаю, можно и для записи и для чтения открывать файл с fmShareDenyNone, но вот запись в файл защищать семафором или мьютексом (но лучше в данном случае делать это с помьщью мьютекса).
Если нужно, чтобы это все работало в достаточной мере надежно, то следует одним объектом синхронизации защитить и запись и чтение, и при записи открывать файл с fmShareDenyWrite.
← →
Loginov Dmitry © (2007-12-17 21:38) [17]Последний абзац удалить забыл ((
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.01.20;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.04 c