[.Net] Singleton приложение
Есть ли красивые решения такой задачи?есть стандартное решение:
приложение при старте проверяет если ли уже запущенная копия, если есть, то посылает ей сообщение и закрывается, иначе просто запускается
приложение при старте проверяет если ли уже запущенная копия, если есть, то посылает ей сообщение и закрывается, иначе просто запускаетсяА поподробнее можно... Какие классы хотя бы для этого использовать или где в MSDN прочитать?
Хочется создать десктопное Windows приложение a la сервис, то есть у него есть 2 состояния - работает и остановлено ( и две кнопки - Запустить, Остановить). При запуске exe-шника приложение должно вести себя примерно так:Как вариант, запускать сервис, а из gui приложения соединяться по remoting с сервисом. При этом gui играет только роль viewer/editor, но не хранит состояние (в твоем случае Запущено/Остановлено). За состояние отвечает сервис.
-если еще не запущено, то запускается и начинает работать
-если уже запущено и остановлено, то начинает работать
-если уже запущено и работает, то продолжает работать.
Есть ли красивые решения такой задачи?
сделать можно почти на любом именованном ядерном объекте, например на мютексе
Как вариант, запускать сервис, а из gui приложения соединяться по remoting с сервисом. При этом gui играет только роль viewer/editor, но не хранит состояние (в твоем случае Запущено/Остановлено). За состояние отвечает сервис.Такой вариант тоже первым в голову пришел, но сервисы использовать не хочется.
Основная сложность, на мой взгляд, это запустить из одного процесса функцию в другом процессе. Можно ли привести пример кода, как это правильно сделать через сообщения.
Как вариант, запускать сервиссервис-то зачем?
Основная сложность, на мой взгляд, это запустить из одного процесса функцию в другом процессе.А вот это нафига?
Если не хочешь сервис делать, делай через именованные mutex-ы
есть статья на рсдн. Искать вломы.
Stop -> переходит в состояние Stopped.
Допустим, что приложение запущено и находится в состоянии Stopped.
Мы запускаем exe-шник и он каким-то образом должен сообщить уже запущенному приложению, чтобы оно выполнило Start. Это же не синхронизация. Как это сделать через mutex-ы? Или это можно сделать как-то по-другому?
Он может проверить на существование мьютекса и ежели он существует - остановиться, сообщив, что приложение уже запущено.
Он может проверить на существование мьютекса и ежели он существует - остановиться, сообщив, что приложение уже запущено.Это то понятно.
Но можно ли при этом "пнуть" уже работающее приложение, чтобы оно начало выполнять некоторую функцию?
ну вот ты когда мышкой или клавой щелкаешь, ты ведь тоже пинаешь приложение извне - посылаешь событие маус_клик и так далее...
Может для этого remoting использовать - тогда приложение будет клиентом и сервером в одном лице?
а тебя это смущает?
можно воспользоваться дырой WM_TIMER =)
можно воспользоваться дырой WM_TIMER =)А как?
приложение при старте проверяет если ли уже запущенная копия, если есть, то посылает ей сообщениеКакие есть средства посылки подобного сообщения кроме remoting?
Какие есть средства посылки подобного сообщения кроме remoting?с ходу могу сказать штук 5, не считая совсем извратных.
но кошерный - только remoting
сначала через Mutex проверяем, запущено ли уже приложение.
Если да, то коннектимся к нему по remoting,вызываем метод Start и закрываемся.
Start анализирует собственное состояниe(работаем или остановлены) и в зависимости от него выполняет некоторое действие.
Всем спасибо за помощь.
А не проще тогда пнуть приложение через именованный event?
ну или проверять наличие программы, сразу обращаясь к потенциальному серверу через remoting, и если не получилось - поднимать свой?
Да ну... named pipes вполне себе кошерны тоже, по-моему. Ещё и переносимы после несложной доработки.
remoting поверх named pipes тоже кошерный
Оставить комментарий
Alex28051973
Хочется создать десктопное Windows приложение a la сервис, то есть у него есть 2 состояния - работает и остановлено ( и две кнопки - Запустить, Остановить). При запуске exe-шника приложение должно вести себя примерно так:-если еще не запущено, то запускается и начинает работать
-если уже запущено и остановлено, то начинает работать
-если уже запущено и работает, то продолжает работать.
Есть ли красивые решения такой задачи?