Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.10.18;
Скачать: CL | DM;

Вниз

Синхронизация "пока есть хотя бы один"   Найти похожие ветки 

 
Дмитрий С ©   (2015-02-20 18:26) [0]

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

Например, есть программы:
A.exe
B.exe
C.exe
и
Support.exe

A, B и C при запуске запускают Support.exe. Про этом Support.exe должен работать в единственном экземпляре (это легко сделать).
Но как только закроются все экземпляры A, B и C - то Support тоже должен закрыться. (вот это не совсем понятно как сделать просто).
При этом не надо полагаться на то, что A, B или C закроются корректно.
А также, если пользователь прибьет Support в диспетчере задач, то это его личное дело.

Пока самая простая идея такая:
Создать/Открыть именованный объект ядра во всех A, B и C.
А в Support в потоке с интервалом проверять существует ли этот именованный объект.


 
Rouse_ ©   (2015-02-20 18:31) [1]

Я ж уже отвечал - job делай и все


 
Дмитрий С ©   (2015-02-20 18:39) [2]


> Rouse_ ©   (20.02.15 18:31) [1]

Это уже другая задача.

Ту я решил внедрением удаленного потока.


 
Smile ©   (2015-02-20 18:44) [3]

"А также, если пользователь прибьет Support в диспетчере задач, то это его личное дело."

Не следует его принуждать к этому ...
Support мешает кому либо?


 
Дмитрий С ©   (2015-02-20 18:52) [4]


> Smile ©   (20.02.15 18:44) [3]

Помогает, пока запущены A B или C.
И мешает, если не запущен ни A, ни B ни C.


 
RWolf ©   (2015-02-20 19:12) [5]

Именно так работают COM-сервера.


 
Владислав ©   (2015-02-20 21:06) [6]

RWolf ©   (20.02.15 19:12) [5]

+1


 
Труп Васи Доброго ©   (2015-02-20 22:16) [7]

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


 
Дмитрий С ©   (2015-02-21 00:27) [8]


> Труп Васи Доброго ©   (20.02.15 22:16) [7]

По-моему кривой метод.


> Именно так работают COM-сервера.

А как узнать что у объекта больше нет клиентов?
По refcount?

И можно ли запустить ком сервер не регистрируя его в реестре?


 
RWolf ©   (2015-02-21 01:59) [9]


> [8]
> А как узнать что у объекта больше нет клиентов?По refcount?

Это не наша забота, ОС сама завершит программу, реализующую COM-сервер.


> И можно ли запустить ком сервер не регистрируя его в реестре?

Клиенты обращаются к серверу по IID, так что без регистрации не обойтись, благо Дельфи встраивает в сервера регистрацию по ключу командной строки /regserver.


 
DVM ©   (2015-02-21 12:45) [10]


> Это не наша забота, ОС сама завершит программу, реализующую
> COM-сервер.

Бывает и так, что сервер остается висеть.


 
Eraser ©   (2015-02-21 18:36) [11]


> Дмитрий С ©   (20.02.15 18:39) [2]


> Ту я решил внедрением удаленного потока.

ополчатся ВСЕ антивирусы.

по данной теме - используй named pipes, там все предельно просто и понятно.

> Пока самая простая идея такая:
> Создать/Открыть именованный объект ядра во всех A, B и C.
>
> А в Support в потоке с интервалом проверять существует ли
> этот именованный объект.

и?


 
Юрий Зотов ©   (2015-02-21 21:20) [12]

> Дмитрий С ©   (20.02.15 18:26)

> Пока самая простая идея такая:
> Создать/Открыть именованный объект ядра во всех A, B и C.
> А в Support в потоке с интервалом проверять существует ли
> этот именованный объект.

ИМХО, нормальная идея, за исключением периодической проверки. Посмотрите в сторону семафоров и WaitForSingleObject. У семафора есть счетчик - в Вашем случае, когда он станет равным 3, Support должен завершиться.


 
Rouse_ ©   (2015-02-21 22:31) [13]

Дим, ты периодически хочешь странного. То первую задачу через нить решаешь, то вторую даешь со странным описанием:
К примеру, если по ТЗ: "пользователь прибьет Support в диспетчере задач, то это его личное дело."
То нафига вообще включать сюда этот процесс? Ну пусть его каждая из задач при старте чекает.
Зы: ну и конечно это все делается через Job, как я и говорил.
Что первая, что вторая задачи, без всяких потоков и их производных


 
Rouse_ ©   (2015-02-22 12:05) [14]

Удалено модератором
Примечание: нет, сек, в этом коде ошибка...


 
Rouse_ ©   (2015-02-22 12:24) [15]

Вот правильный код на обе задачи: https://dl.dropboxusercontent.com/u/70911765/job.zip
(В предыдущем варианте немного с выравниванием структур напутал).


 
Rouse_ ©   (2015-02-22 13:59) [16]

А вот тебе и подробное описание подхода: http://alexander-bagel.blogspot.ru/2015/02/job.html


 
картман ©   (2015-02-22 19:45) [17]


> Дмитрий С ©   (21.02.15 00:27) [8]
>
>
> И можно ли запустить ком сервер не регистрируя его в реестре?
>

ты вроде это делал))


 
Юрий Зотов ©   (2015-02-22 19:50) [18]

> Rouse_

Сань, шикарно. Кстати, потихоньку зреет книжка - не думал об этом?


 
Rouse_ ©   (2015-02-22 23:09) [19]

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


 
Юрий Зотов ©   (2015-02-23 01:03) [20]

> Rouse_

И не надо. Книжка ведь может состоять из глав, а главы не обязаны следовать одной теме.


 
DVM ©   (2015-02-23 10:47) [21]


> Юрий Зотов ©   (23.02.15 01:03) [20]


> Книжка ведь может состоять из глав, а главы не обязаны следовать
> одной теме.

Это будет не книга, а сборник рецептов. Хорошая книга должна последовательно освещать ОДНУ тему или несколько связанных между собой тем, а не пытаться урывками объять необъятное.


 
junglecat ©   (2015-02-23 10:57) [22]

"О вкусной и здоровой отладке"


 
Юрий Зотов ©   (2015-02-23 10:59) [23]

> DVM ©   (23.02.15 10:47) [21]

Как насчет огромного множества хороших и полезных книжек под общим субназванием "Сборник статей"?


 
DVM ©   (2015-02-23 11:03) [24]


> Юрий Зотов ©   (23.02.15 10:59) [23]

Мне кажется, что такой формат больше подходит для блогов и Интернета. Времена изменились. Ибо покупать бумажную книгу со сборником статей вряд ли кто будет, если его интересует одна-две статьи из множества. Мне так кажется. Другое дело, когда человек хочет изучить вполне определенную область, например, программирование сетей под Windows, тогда в книге собрана вся интересующая информация и он с большей вероятностью купит книгу.


 
DVM ©   (2015-02-23 11:07) [25]

Вот если о чем Александру и стоит писать книгу, так это о методах защиты современного ПО и методах взлома этих же защит. Вот это будет целостное изложение, материала и знаний у него, думаю, хватит. Отдельной главой Guardant прописать, а компанию Актив в спонсоры :)


 
Дмитрий С ©   (2015-02-24 13:14) [26]


> Rouse_ ©   (22.02.15 13:59) [16]

Изучил, благодарю!
Перепишу на job-ы.

Будут вопросы, буду задавать в статье.
Еще раз спасибо!


 
Дмитрий С ©   (2015-02-24 13:41) [27]

Не добавляется комментарий там. Пишу тут:

Вопрос к http://alexander-bagel.blogspot.ru/2015/02/job.html

Обзовем программы из первой задачи следующим образом: A.exe - основная, Sub.exe ведомая. (A.exe - общая на обе задачи)

И теперь объединим обе задачи:
A.exe запускает Sub.exe и последний должен закрыться как только закроется A.exe.
A.exe, B.exe, C.exe запускают Support.exe, который должен закрыться как только закроются все A, B и C.
Sub.exe не должен работать, если закрылась A, а B или C работают.

Как быть?


 
Дмитрий С ©   (2015-02-24 13:44) [28]

+ еще одно условие, хоть и простое, мне кажется (приведу сразу все):

1. A.exe запускает Sub.exe и последний должен закрыться как только закроется A.exe.
2. A.exe, B.exe, C.exe запускают Support.exe, который должен закрыться как только закроются все A, B и C.
3. Sub.exe не должен работать, если закрылась A, а B или C работают.
4. A.exe должен сразу "узнать", если Sub.exe закрылся или его кто-то "прибил".


 
Дмитрий С ©   (2015-02-24 13:51) [29]

Хотя, кажется, и сам понял.


 
Дмитрий С ©   (2015-02-27 18:19) [30]

В общем сделал эту задачу с помощью Job-ов.

Предыдущую задачу оставил с потоком, потому что это позволяет завершить подчиненный процесс корректно.


 
Rouse_ ©   (2015-02-27 18:21) [31]

Вторую через два JOB-а решил?


 
Rouse_ ©   (2015-02-27 18:23) [32]

ЗЫ: кстати у меня в блоге "NameRec" - это ты?


 
Дмитрий С ©   (2015-02-27 18:44) [33]


> Вторую через два JOB-а решил?

Через один: A, B и C выполняют CreateJobObject, запускают Support, присоединяя его и держат хендл Job-а открытым до завершения работы.
Support сам следит, чтобы его не запускали два раза, с помощью именованного евента. Этот же евент используется для других полезных целей.

PS. Я не могу комментировать твой блок из-за того что у меня отключены сторонние куки.


 
Rouse_ ©   (2015-02-27 19:02) [34]

Эмм, я не про первоначальную задачу спрашивал, с ней то понятно, я про вторую, которая:

Дмитрий С ©   (24.02.15 13:44) [28]


 
Дмитрий С ©   (2015-02-27 19:29) [35]


> Rouse_ ©   (27.02.15 19:02) [34]

Теоретически да, на практике - нет.
Оставил удаленный поток, чтобы закрывать Sub.exe штатным образом.


 
Rouse_ ©   (2015-02-27 19:42) [36]

Там вообще идея должна быть проста - пропускаем все пять задач по двум джобам, первые 3  рутовых процесса в первый плюс Support и во второй джоб процессы А и Sub (немного с нотификациями придется помучатся в особо изощренных случаях).
Про нотификации я у себя в блоге отписал по верхней ссылке.


 
Дмитрий С ©   (2015-02-28 01:16) [37]

Первые три, как я понял, сами не находятся в job-е, только "держат" хендл.

А вот с Sub сложнее - это приложение не моё. Оно консольное и корректно закрывается по Ctrl+C. Я не вникал ещё в в нотификации, но мне кажется они тут не помогут.


 
Дмитрий С ©   (2015-03-04 16:06) [38]

А есть способ узнать по хендлу объекта узнать, открыт ли он еще кем нибудь?


 
Rouse_ ©   (2015-03-04 17:02) [39]

Смотря что за объект


 
Дмитрий С ©   (2015-03-04 17:09) [40]


> Rouse_ ©   (04.03.15 17:02) [39]

JobObject. Мне с целью попробовать штатно завершить.



Страницы: 1 2 вся ветка

Текущий архив: 2015.10.18;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.006 c
2-1400941622
Y
2014-05-24 18:27
2015.10.18
program can t start because rtl70.bpl is missing from your comput


11-1249495316
D[u]fa
2009-08-05 22:01
2015.10.18
SVN, BUGS and etc


15-1424445966
Дмитрий С
2015-02-20 18:26
2015.10.18
Синхронизация "пока есть хотя бы один"


8-1235972503
TELOvek
2009-03-02 08:41
2015.10.18
Получение картинки из документа Word


8-1236965503
random(1024)
2009-03-13 20:31
2015.10.18
Синтез звука MIDI