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

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

Ограничение числа экземпляров


Страницы:   1 2 3 4 5

TStas ©   (2006-03-20 14:51:00) 

Читал сегодня статью с форума на эту тему, много это обсуждалось. ОДно мне непонятно: чем вариант с инишкой плох. СПециально только что провери - все отлично работает.
Вот файл проекта:
program Project1;

uses
 Forms,
 Unit1 in 'Unit1.pas', {Form1}
 IniFiles, SysUtils;
{$R *.res}

var
 ini: TINiFile;
 b: Boolean;
begin

 ini:=TINiFile.Create(ExtractFilePath(Application.ExeName)+'Run.ini');
 B:=Ini.ReadBool('Runned', 'Already', false);
 Ini.WriteBool('Runned', 'Already', true);
 if b then
   begin
   Ini.Free;
   Halt;
   end;
 Ini.Free;

 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;

end. //В нем -то и чииается инишка
А вот файл формы, в нем инишка ставится на место
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm1 = class(TForm)
   procedure FormDestroy(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation
uses IniFiles;
{$R *.dfm}

procedure TForm1.FormDestroy(Sender: TObject);
var
 ini: TIniFile;
begin
ini:=TINiFile.Create(ExtractFilePath(Application.ExeName)+'Run.ini');
Ini.WriteBool('Runned', 'Already', false);
Ini.Free;
end;

end.
ВСе работает. МОжет, в каких-то сложных случаях что-то не так?


Leonid Troyanovsky   (2006-03-30 11:33:00) [41]


> Рафик ©   (30.03.06 10:14) [55]

> А если я программу запущу от разных пользователей?


Разные пользователи работают в разных сессиях.

--
Regards, LVT.


Рафик   (2006-03-30 10:14:00) [42]

А если я программу запущу от разных пользователей?


Leonid Troyanovsky   (2006-03-30 09:08:00) [43]


> Defunct ©   (30.03.06 03:56) [52]

> Ссылка к сожалению у меня не открылась.


Сочуствую.
Вообще-то, http://msdn.microsoft.comвесьма полезный ресурс,
бо содержит наиболее актуальную информацию.
Так что, стоит пнуть своих админов.

--
Regards, LVT.


Leonid Troyanovsky   (2006-03-30 09:06:00) [44]


> Fay ©   (29.03.06 20:12) [51]

> > GUID мне представляется корявым

> Корявее, чем FindWindow? Ню-ню...


Зашить в код GUID - конечно, более корявое решение.
Лично я предпочту EnumWindows (хотя, и не совсем FindWindow).
Для гуевых дельфийских приложений этого вполне хватает.
Неатомарность сочетания if EnumWindows() then .. меня
вовсе не расстраивает, бо в самом плохом случае (скажем, на
двухпроцессорной машине при "удачном" стечении обстоятельств)
запустятся два приложения, но это никак не должно отразиться на
их работоспособности.

Если же эти приложения и в самом деле нуждаются
в эксклюзивном доступе к неким ресурсам, то этот доступ
они и должны организовывать адекватным способом, а
не путем добровольного самопожертвования.

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

Поэтому, ничего зашивать в код и не следует.

Ну, а для полноты же картины я бы упомянул еще один подход:

http://groups.google.com/group/fido7.ru.delphi.chainik/msg/278f89887ab26b31

--
Regards, LVT.


Defunct   (2006-03-30 03:56:00) [45]

Leonid Troyanovsky ©   (29.03.06 08:37) [50]

Ссылка к сожалению у меня не открылась.

Если там речь идет о рекомендациях не использовать SetForegroundWindow и
MS считает, что запустив приложение, которое просто молча сгинет из-за присутствия более старой копии и не передаст фокус старой копии - допустимо, то пусть они со своими ограничениями катятся куда подальше. Более того на это у меня есть мнение - идиотов хватает и среди тех кто пишет правила. До инфаркта пользователя нехорошо доводить, а это поверьте возможно, когда пром. программа "откажется" запускаться без причины.

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


Fay   (2006-03-29 20:12:00) [46]

2 Leonid Troyanovsky ©   (28.03.06 14:18) [46]
> GUID мне представляется корявым
Корявее, чем FindWindow? Ню-ню...


Leonid Troyanovsky   (2006-03-29 08:37:00) [47]


> Defunct ©   (29.03.06 01:44) [49]

> Здесь я не соглашусь.. Т.к. по сути foreground приложение
> передает фокус своей более старой копии самостоятельно и
> добровольно.


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/setforegroundwindow.asp

Хотя, более точно restrictions описаны в remarks to LockSetForegroundWindow

--
Regards, LVT.


Defunct   (2006-03-29 01:44:00) [48]

Piter ©   (28.03.06 17:23) [47]
Бессмысленное переливание из пустого в порожнее.
(это не к тебе лично относится, а к тому во что превратилась ветка).

Leonid Troyanovsky ©   (28.03.06 14:18) [46]
> Одну ошибку видно сразу: не foreground приложению не положено
делать себя foreground.

Здесь я не соглашусь.. Т.к. по сути foreground приложение передает фокус своей более старой копии самостоятельно и добровольно.

> Кроме того, мне очень не нравятся бродкасты, хотя, конечно,
это не ошибка.

Это мнение я уже слышал и с ним даже согласен. Да броадкаст это плохо, да отвлекает почти все приложения, но запуск таких программ, как та в которой у меня произодится броадкаст происходит один раз со стартом сервера, и потом только админ может ее случайно запустить, и то врятли ему это придет в голову когда в трее и так висит иконка программы...


Leonid Troyanovsky   (2006-03-28 19:14:00) [49]


> Piter ©   (21.03.06 20:28) [17]

> * у тебя элементарно нету ОДНОЙ функции, которая может проверить
> наличие окна и создать новое


У меня есть. Только это не совсем функция, а, скажем, подход.
Но, сути ж оно не меняет?

--
Regards, LVT.


Piter   (2006-03-28 17:23:00) [50]

Defunct ©   (28.03.06 2:35) [45]
Тогда откуда у тебя вдруг такая уверенность, что там именно сообщения и используются именно так, как привел я в [34].


я, собственно, не говорил, что там используется твой вариант

Defunct ©   (28.03.06 2:35) [45]
По поводу второго - если ты хочешь сказать, что мое решение неправильное - тогда найди ошибку.


я тебе уже привел пример неправильного срабатывания твоего кода. Да, двойной запуск не произойдет, но мы что, побочными эффектами пренебрегаем?

Defunct ©   (28.03.06 2:35) [45]
Что-то я не вижу варианта с мьютексами


ты его легко можешь сам реализовать. И он прописан везде, в интернете куча примеров, в книжках многих написан

Defunct ©   (28.03.06 2:35) [45]
Вариант с сообщениями лично меня ни разу не подвел, поэтому  могу сказать, что он на 100% надежен


Ну тут даже и без комментариев.

Ты вполне можешь следовать логике "Если я не вижу ошибок - значит, их нет" - пожалуйста. Я пытаюсь по другому.


Leonid Troyanovsky   (2006-03-28 14:18:00) [51]


> Defunct ©   (28.03.06 02:35) [45]


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

Одну ошибку видно сразу: не foreground приложению не положено
делать себя foreground.

Кроме того, мне очень не нравятся бродкасты, хотя, конечно,
это не ошибка.

> 1. Что-то я не вижу варианта с мьютексами.

Я бы лучше увидел вариант с проекцией файла :)
Однако, сразу оговорюсь: должен быть обоснован выбор имени,
бо зашивать в код, скажем, GUID мне представляется корявым.

> 2. Вариант с сообщениями лично меня ни разу не подвел, поэтому
>  могу сказать, что он на 100% надежен.

Чтобы подлить масла в огонь, предложу свой давнишний вариант

http://groups.google.com/group/borland.public.delphi.winapi/msg/b2ebfc63eb002ebe

Хотя, конечно, и он не свободен от недостатков (кто заметит - каких?),
но, со своей задачей он справляется вполне успешно.

--
Regards, LVT.


Defunct   (2006-03-28 02:35:00) [52]

Piter ©   (26.03.06 17:23) [43]
> если бы оно использовало мьютексы - такой ситуации в принципе не могло бы возникнуть.

Тогда откуда у тебя вдруг такая уверенность, что там именно сообщения и используются именно так, как привел я в [34].
Криво можно написать что угодно.

> Мы говорим про оптимальные и правильные решения.
По поводу первого критерия - "оптимальность" - понятие растяжимое.
По поводу второго - если ты хочешь сказать, что мое решение неправильное - тогда найди ошибку.

> Я придерживаюсь принципа, что если можно сделать лучше - то надо сделать лучше, несмотря на то, что другое решение будет работать в 99% случаев. Но если теми же усилиями ты можешь сделать так, чтобы работало в 100% случаев - то надо сделать так.

1. Что-то я не вижу варианта с мьютексами.
2. Вариант с сообщениями лично меня ни разу не подвел, поэтому  могу сказать, что он на 100% надежен.

>>Defunct ©   (26.03.06 3:40) [42]
>>Может окошко диалап соединения использует мьютексы?
>если бы оно использовало мьютексы - такой ситуации в принципе не могло бы возникнуть.

Да что ты такое говоришь? Мьютекс лишь средство, а более важный вопрос это то - как это средство используется программистом. Программист может все испаганить сам имея в арсенале очень мощные средства..
Я могу с полной уверенностью сказать, что задачу автора можно надежнорешить любыми средствами обспечивающими общий доступ (шару) в т.ч. даже с помощью общего файла, общего сокета, общего ключа системного реестра и т.п., главное чтобы используемый ресурс был общим.


MegaVolt   (2006-03-27 17:26:00) [53]

99% в одном месте 99% в другом в результате уже вероятность сбоя 2%
Если таких мест 100 то прога будет глючить стабильно. Вот чтобы этого не было и стараются хоть там где это точно возможно сделать 100% а не 99%


Piter   (2006-03-26 17:23:00) [54]

Defunct ©   (26.03.06 3:40) [42]
И нафига, конкретно мне мьютексы?


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

Я придерживаюсь принципа, что если можно сделать лучше - то надо сделать лучше, несмотря на то, что другое решение будет работать в 99% случаев. Но если теми же усилиями ты можешь сделать так, чтобы работало в 100% случаев - то надо сделать так.

Defunct ©   (26.03.06 3:40) [42]
Может окошко диалап соединения использует мьютексы?


если бы оно использовало мьютексы - такой ситуации в принципе не могло бы возникнуть.


Defunct   (2006-03-26 03:40:00) [55]

Piter ©   (25.03.06 02:16) [40]
> а ты всегда это пишешь, когда предлагают решение БОЛЕЕ оптимальное, чем твое?

Я не настаиваю на своем решении и тем более не говорю, что оно самое оптимальное и все должны делать именно так. Просто оно (решение) есть, и работает надежно. И нафига, конкретно мне мьютексы?
"Людоеды любят лук."

> думаю, создание формы для этого вовсе не обязательно. Причем, такое создание, что в OnCreate вызывается Halt...
imho - это уже из разряда экономии спичек.

> я тебе уже писал, что мне удавалось открыть 2 окошка установления одного Dial-up соединения.
Ну и что? Может окошко диалап соединения использует мьютексы? Или у тебя есть уверенность, что оно использует сообщения? Что-то мысль твою не уловил.


Piter   (2006-03-25 02:18:00) [56]

Defunct ©   (25.03.06 1:46) [39]
Т.к. ни один дибил не будет специально кликать по 30 раз на твоей программе


я тебе уже писал, что мне удавалось открыть 2 окошка установления одного Dial-up соединения. Правда, в этом время компьютер дикто тормозил и жутко свопил, но какая разница. И я не тыкал 30 раз.


Piter   (2006-03-25 02:16:00) [57]

Defunct ©   (25.03.06 1:46) [39]
Напоминает отрывок из Шрека:
- Ириски! Все любят ириски! Шрек, ты любишь ириски?


а ты всегда это пишешь, когда предлагают решение БОЛЕЕ оптимальное, чем твое?

Defunct ©   (25.03.06 1:46) [39]
Хотя к сожалению оно не сработает, одна копия таки останется


почему не сработает? Расскажи. Ты видимо ковырял исходники Windows.

Defunct ©   (25.03.06 1:46) [39]
Например, чтобы передать параметры или выполнить кое-какие действия.


думаю, создание формы для этого вовсе не обязательно. Причем, такое создание, что в OnCreate вызывается Halt...


Defunct   (2006-03-25 01:46:00) [58]

Piter ©   (24.03.06 18:25) [38]
> а, ну если тебя это устраивает...

Не надо доходить до крайностей. Т.к. ни один дибил не будет специально кликать по 30 раз на твоей программе. А коль уж действительно попадется такой дибил, которому вместо того чтобы работать с программой, надо, зная что программа расчитана одновременную работу только одной копии, всяко поизгаляться чтобы запустить 2 копии или больше, то это вполне нормальное для него наказание. Хотя к сожалению оно не сработает, одна копия таки останется.

> Я не понимаю, зачем использовать этот способ, если можно использовать мьютексы? Она гарантировано дадут результат.
> К тому же, мьютексы использовать оптимальнее.


Напоминает отрывок из Шрека:
- Ириски! Все любят ириски! Шрек, ты любишь ириски?

> В твоем случае уже много что сделано, произведена инициализация всех модулей, созданы некоторые формы, зачем это, если запускаться не планируем?
Например, чтобы передать параметры или выполнить кое-какие действия.


Piter   (2006-03-24 18:25:00) [59]

Defunct ©   (24.03.06 17:33) [37]
то, как я и говорил, в худшем случае закроются обе программы


а, ну если тебя это устраивает...

Но все таки я бы назвал это некорректным поведением.

Я не понимаю, зачем использовать этот способ, если можно использовать мьютексы? Она гарантировано дадут результат.

К тому же, мьютексы использовать оптимальнее. В твоем случае уже много что сделано, произведена инициализация всех модулей, созданы некоторые формы, зачем это, если запускаться не планируем?

А проверку мьютексами можно сделать прямо в самом начале.


Defunct   (2006-03-24 17:33:00) [60]

Piter ©   (24.03.06 16:59) [35]

Если следовать твоим рассуждениям, то, как я и говорил, в худшем случае закроются обе программы. Но запуск нескольких копий - однозначно исключен.


Страницы:   1 2 3 4 5

Наверх

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