Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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  в помошь &#133


 
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.083 c
3-1189148317
KOMArKad
2007-09-07 10:58
2008.01.20
Запрос в два потока


2-1198380081
Шар
2007-12-23 06:21
2008.01.20
Как читать данные из потока в такое поле ?


2-1198055139
kyn66
2007-12-19 12:05
2008.01.20
ADSQuery1.Requery ???


8-1172655767
DevilDevil
2007-02-28 12:42
2008.01.20
Проиграть OGG.


15-1197397958
@!!ex
2007-12-11 21:32
2008.01.20
Песни советских времен





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский