[.Net] Singleton приложение

Alex28051973

Хочется создать десктопное Windows приложение a la сервис, то есть у него есть 2 состояния - работает и остановлено ( и две кнопки - Запустить, Остановить). При запуске exe-шника приложение должно вести себя примерно так:
-если еще не запущено, то запускается и начинает работать
-если уже запущено и остановлено, то начинает работать
-если уже запущено и работает, то продолжает работать.
Есть ли красивые решения такой задачи?

Dasar

Есть ли красивые решения такой задачи?
есть стандартное решение:
приложение при старте проверяет если ли уже запущенная копия, если есть, то посылает ей сообщение и закрывается, иначе просто запускается

Alex28051973

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

Helga87

Хочется создать десктопное Windows приложение a la сервис, то есть у него есть 2 состояния - работает и остановлено ( и две кнопки - Запустить, Остановить). При запуске exe-шника приложение должно вести себя примерно так:
-если еще не запущено, то запускается и начинает работать
-если уже запущено и остановлено, то начинает работать
-если уже запущено и работает, то продолжает работать.
Есть ли красивые решения такой задачи?
Как вариант, запускать сервис, а из gui приложения соединяться по remoting с сервисом. При этом gui играет только роль viewer/editor, но не хранит состояние (в твоем случае Запущено/Остановлено). За состояние отвечает сервис.

vall

сделать можно почти на любом именованном ядерном объекте, например на мютексе

Alex28051973

Как вариант, запускать сервис, а из gui приложения соединяться по remoting с сервисом. При этом gui играет только роль viewer/editor, но не хранит состояние (в твоем случае Запущено/Остановлено). За состояние отвечает сервис.
Такой вариант тоже первым в голову пришел, но сервисы использовать не хочется.
Основная сложность, на мой взгляд, это запустить из одного процесса функцию в другом процессе. Можно ли привести пример кода, как это правильно сделать через сообщения.

Dasar

Как вариант, запускать сервис
сервис-то зачем?

Helga87

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

FRider

есть статья на рсдн. Искать вломы.

Alex28051973

Приложение по сути имеет функции Start ->переходит в состояние Started и
Stop -> переходит в состояние Stopped.
Допустим, что приложение запущено и находится в состоянии Stopped.
Мы запускаем exe-шник и он каким-то образом должен сообщить уже запущенному приложению, чтобы оно выполнило Start. Это же не синхронизация. Как это сделать через mutex-ы? Или это можно сделать как-то по-другому?

FRider

Он может проверить на существование мьютекса и ежели он существует - остановиться, сообщив, что приложение уже запущено.

Alex28051973

Он может проверить на существование мьютекса и ежели он существует - остановиться, сообщив, что приложение уже запущено.
Это то понятно.
Но можно ли при этом "пнуть" уже работающее приложение, чтобы оно начало выполнять некоторую функцию?

lubanj

ну вот ты когда мышкой или клавой щелкаешь, ты ведь тоже пинаешь приложение извне - посылаешь событие маус_клик и так далее...

Alex28051973

так хочется сделать нечто подобное только программно.
Может для этого remoting использовать - тогда приложение будет клиентом и сервером в одном лице?

FRider

а тебя это смущает?

vall

можно воспользоваться дырой WM_TIMER =)

Alex28051973

можно воспользоваться дырой WM_TIMER =)
А как?

Alex28051973

приложение при старте проверяет если ли уже запущенная копия, если есть, то посылает ей сообщение
Какие есть средства посылки подобного сообщения кроме remoting?

Dasar

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

Alex28051973

То есть, подводя итог, решение задачи такое:
сначала через Mutex проверяем, запущено ли уже приложение.
Если да, то коннектимся к нему по remoting,вызываем метод Start и закрываемся.
Start анализирует собственное состояниe(работаем или остановлены) и в зависимости от него выполняет некоторое действие.
Всем спасибо за помощь.

SPARTAK3959

А не проще тогда пнуть приложение через именованный event?

freezer

ну или проверять наличие программы, сразу обращаясь к потенциальному серверу через remoting, и если не получилось - поднимать свой?

bleyman

//но кошерный - только remoting
Да ну... named pipes вполне себе кошерны тоже, по-моему. Ещё и переносимы после несложной доработки.

Dasar

remoting поверх named pipes тоже кошерный ;)
Оставить комментарий
Имя или ник:
Комментарий: