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