Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Один инстанс


Страницы:   1 2

vecna ©   (2004-07-06 15:19:00) 

народ, подкиньте ссылок, где разобраны варианты с не запуском более чем N копий программы одновременно.


DiamondShark   (2004-07-07 18:02:00) [1]


> Игорь Шевченко ©   (07.07.04 17:53) [35]
>
> А я решение не для Subj приводил, а для похожей задачи.
> О чем и написал, кстати :) Для Subj больше подходит решение
> y-soft, которое не позволяет запустить больше указанного
> числа приложений.

А, ну значит я просто не врубился. Кстати, не я один. Прочтите последующее обсуждение. Народ уверен, что решение именно для субж, а не для несколько изменённой задачи.


> Прочитал, не понял.

Я поправился. В [30] нет переноса трай на строчку.


Sandman25   (2004-07-07 17:53:00) [2]

Упс. Получается, что в WaitForSingleObject exception сгенерится не может. Кода [30] достаточно.


Игорь Шевченко   (2004-07-07 17:53:00) [3]

DiamondShark ©   (07.07.04 17:47)

А я решение не для Subj приводил, а для похожей задачи. О чем и написал, кстати :) Для Subj больше подходит решение y-soft, которое не позволяет запустить больше указанного числа приложений.


> Читаем внимательно пост № 30


Прочитал, не понял. Мне не нужно завершать приложение по недоступности ресурса, мне нужно подождать, пока ресурс не освободится.


DiamondShark   (2004-07-07 17:47:00) [4]


> Игорь Шевченко ©   (07.07.04 17:41) [32]
> DiamondShark ©   (07.07.04 17:25)
>
> Читаем внимательно пост № 21, мне Exit не нужен.

Читаем внимательно субж.


> Смысла в переносе try на строчку выше я, честно говоря,
> не вижу. Было бы интересно узнать, в чем он.

Читаем внимательно пост № 30


Sandman25   (2004-07-07 17:45:00) [5]

[32] Игорь Шевченко ©   (07.07.04 17:41)

WaitForSingleObject может завершиться по runtime ошибке. Тогда будет произведен ReleaseSemaphore, хотя захват не происходил.


Игорь Шевченко   (2004-07-07 17:41:00) [6]

DiamondShark ©   (07.07.04 17:25)

Читаем внимательно пост № 21, мне Exit не нужен. Смысла в переносе try на строчку выше я, честно говоря, не вижу. Было бы интересно узнать, в чем он.


Sandman25   (2004-07-07 17:37:00) [7]

Тогда уже так :)


try
 if WaitForSingleObject(SemHandle, 0) <> WAIT_OBJECT_0 then
   Exit;
 try
  ..... код приложения ....
 finally
   ReleaseSemaphore(SemHandle, 1, nil);
 end;
finally
CloseHandle(SemHandle);
end


DiamondShark   (2004-07-07 17:34:00) [8]

Но это тоже не правильно :)

if WaitForSingleObject(SemHandle, 0) <> WAIT_OBJECT_0 then
 begin
   CloseHandle(SemHandle);
   Exit;
 end;
try
..... код приложения ....
finally
 ReleaseSemaphore(SemHandle, 1, nil);
 CloseHandle(SemHandle);
end;


Sandman25   (2004-07-07 17:27:00) [9]

Понятно.


DiamondShark   (2004-07-07 17:25:00) [10]


> Sandman25 ©   (07.07.04 17:21) [27]
> [26] DiamondShark ©   (07.07.04 17:16)
>
> В смысле try на строчку выше надо?

Не только.

try
  if WaitForSingleObject(SemHandle, 0) <> WAIT_OBJECT_0 then Exit;
..... код приложения ....
finally
  ReleaseSemaphore(SemHandle, 1, nil);
  CloseHandle(SemHandle);
end;


Sandman25   (2004-07-07 17:21:00) [11]

[26] DiamondShark ©   (07.07.04 17:16)

В смысле try на строчку выше надо?


DiamondShark   (2004-07-07 17:16:00) [12]


> Игорь Шевченко ©   (07.07.04 15:25) [15]
> Кстати, буквально сегодня встала задача ограничить число
> одновременно работающих экземпляров приложения до некоторого
> числа (связано с ограничениями серверов, с которыми это
> приложение соединяется).
>
> Сделали очень просто:

И не верно.


y-soft   (2004-07-07 17:10:00) [13]

>Игорь Шевченко ©   (07.07.04 17:05) [24]

Ну так, сколько программистов - столько и решений :) "Универсальные" только в FAQ'ах :)


Игорь Шевченко   (2004-07-07 17:05:00) [14]

y-soft ©   (07.07.04 16:54) [23]


> А Initialize потому, что при таком подходе есть одно важное
> достоинство - когда он выполняется, приложение еще не загрузило
> никаких ресурсов, особенно, если модуль стоит первым в USES


Неудобно, на мой взгляд. У меня, например, конфигурация считывается в трех других unit'ах :) А когда работа приложения зависит от порядка перечисления unit'ов, кроме того, что для одного явно указано, что он должен быть первым (пример с ShareMem) это уже не есть очень хорошо.


> Надеюсь, ты не согласен с доводами, подобными [22]? :)))


Не согласен.


> В общем-то мьютексы для таких задач и придуманы...


В общем-то, мьютексы придуманы для задач, которые гарантировано должны запускаться поодиночке :)
У меня несколько иная ситуация, сервер позволяет подключиться довольно большому числу клиентов, но с разных компьютеров. Количество подключений с одного компьютера ограничено.


y-soft   (2004-07-07 16:54:00) [15]

>Игорь Шевченко ©   (07.07.04 16:23) [21]

Я писал универсальное решение для кнопкокидателей :)

Можно и заставить ждать освобождения ресурсов, если установить константу в INFINITE (я вырезал это замечание из исходного кода, чтобы меньше места занимал). Можно и читать значения из INI-файлов, реестра и т.п. Можно даже считывать уникальное имя для мьютекса, вместо того, чтобы "вращать слеши"... А Initialize потому, что при таком подходе есть одно важное достоинство - когда он выполняется, приложение еще не загрузило никаких ресурсов, особенно, если модуль стоит первым в USES

Надеюсь, ты не согласен с доводами, подобными [22]? :)))

В общем-то мьютексы для таких задач и придуманы...


evvcom   (2004-07-07 16:23:00) [16]


> Создается впечатление, что Вы даже не смотрели код.

А я его и не смотрел. Сделал вывод по

> Недостаток: не работает, если приложение запускается из
> разных директорий

Мне этого хватило. Для ответа на любой вопрос достаточно двух-трех ключевых строк кода. В [15] немного больше, но там весь код программы, и написан он оптимально! Вот в таком коде приятно разбираться.
А Ваш код не умещается даже на экранную страницу! Разбираться в этом мне лень.


Игорь Шевченко   (2004-07-07 16:23:00) [17]

y-soft ©   (07.07.04 16:01)

У нас с тобой несколько разные задачи - у меня задача не завершать приложение, при невозможности обратиться к ресурсу, а просто подождать, пока он не освободиться. Кроме того, у меня максимальное число обновременно работающих приложений считывается из настроек, поэтому, увы, разместить код в секциях initialization, finalization не получится.

С уважением,


NAlexey   (2004-07-07 16:04:00) [18]

>Игорь Шевченко ©   (07.07.04 15:25) [15]
Красиво.


y-soft   (2004-07-07 16:01:00) [19]

>evvcom ©   (07.07.04 15:55) [18]

Создается впечатление, что Вы даже не смотрели код. Принцип тот же, что и в [15], но уникальное имя для семафора формируется автоматически. К тому же не надо ничего писать в DPR, достаточно поместить модуль в USES первым...


evvcom   (2004-07-07 15:55:00) [20]


> KADAN ©   (07.07.04 15:32) [16]
> одно из двух запускаемых уже ее создало, и готово принимать
> ответы на свой BroadCast, а другое сделает это чуть попозже
> и ему скажут, что уже поздно.

Никто никому ничего не скажет, если запущено 2 приложения с интервалом доли секунды. Если только посылать это сообщение после того, как создана главная форма, но это бессмысленная трата драгоценных ресурсов.

> y-soft ©   (07.07.04 15:34) [17]

Стоит ли городить такой огород, если к тому же имеются недостатки.
Учитесь у Мастеров. См. [15] - коротко, ясно и надежно!


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо