![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ограничение числа экземпляров
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]
Если следовать твоим рассуждениям, то, как я и говорил, в худшем случае закроются обе программы. Но запуск нескольких копий - однозначно исключен.