Текущий архив: 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.007 c