Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
 Re: Глобальный reference counter для нескольких процессов?  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 6369
Кроик Семён
А вот если организовать что-то такое:

1) простенькой COM-объект
2) и пусть каждое приложение создаёт себе его экземпляр
3) у COM-объекта пусть будет событие (не знаю, возможно такое), связанное с изменением числа инстансов и обработчик этого события и есть искомая фишка
тоже самое что и в 22329725
2 июн 21, 13:37    [22330299]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32405
а где ТС?
2 июн 21, 13:53    [22330307]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Barmaley57
Member

Откуда: Москва
Сообщений: 5866
Barmaley57
Каждый процесс создаёт в заведомо известном каталоге временный файл (флаг FILE_FLAG_DELETE_ON_CLOSE) и подписывается на изменения содержимого каталога.
Всё. Телемаркет.
Возможно, надо дополнить мысль: каждый процесс создает уникальный файл и, получая уведомления об изменении в ФС, считает кол-во файлов. Все форс-мажоры отдаются на откуп ОСи.
2 июн 21, 14:09    [22330317]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Virtual Student
Member

Откуда: Belarus
Сообщений: 347
Мимопроходящий

семафоры

+1
2 июн 21, 14:16    [22330323]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53472

Мне уже интересно: как это реализовать на семафорах? Раз плюсуют, значит знают способ...

Posted via ActualForum NNTP Server 1.5

2 июн 21, 14:20    [22330328]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 62816
Автор невовремя пропал, конечно.
Квейд
Хочу решить такую задачу - мне нужно отреагировать в момент,
когда пользователь закрывает два экземляра, и остается только один (последний).

Для этого reference counter не нужен.
2 июн 21, 14:28    [22330339]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4654
Мимопроходящий
а где ТС?
Он своё дело сделал
2 июн 21, 14:33    [22330344]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 62816
Не, это стародавний товарищ, а не тролль-новобранец. :)

Posted via ActualForum NNTP Server 1.5

2 июн 21, 14:36    [22330347]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4654
Barmaley57
Barmaley57
Каждый процесс создаёт в заведомо известном каталоге временный файл (флаг FILE_FLAG_DELETE_ON_CLOSE) и подписывается на изменения содержимого каталога.
Всё. Телемаркет.
Возможно, надо дополнить мысль: каждый процесс создает уникальный файл и, получая уведомления об изменении в ФС, считает кол-во файлов. Все форс-мажоры отдаются на откуп ОСи.
Ситуация. Папка пустая. Два процесса запускаются одновременно.
Если будут считать файлы перед созданием своего - будут считать себя главными оба.
Если после - то оба будут считать себя НЕглавными (с большой вероятностью).
Каша какая-то, по нотификации изменений следить...
2 июн 21, 14:37    [22330348]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65951
Блог
Мимопроходящий
а где ТС?

Сделал всё на семафорах после первого коммента :)
2 июн 21, 14:37    [22330349]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Virtual Student
Member

Откуда: Belarus
Сообщений: 347
Dimitry Sibiryakov,
Да, вроде, ничего сложного.
https://delphi.cjcsoft.net/viewthread.php?tid=47350
Семафор, он же именованный и уникальный для всей системы.
2 июн 21, 14:37    [22330350]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Virtual Student
Member

Откуда: Belarus
Сообщений: 347
Хотя я бы еще проще поступил (для твоей задачи). Возможно, это тупо...
Но просто писал бы реестр нужную циферку. А реестр, один фиг в памяти болтается. Так, что все весьма шустро.
2 июн 21, 14:40    [22330354]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53472

Virtual Student
Да, вроде, ничего сложного.

Только тамошний пример не имеет ничего общего с задачей топика...

Posted via ActualForum NNTP Server 1.5

2 июн 21, 14:43    [22330357]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Barmaley57
Member

Откуда: Москва
Сообщений: 5866
YuRock
Ситуация. Папка пустая. Два процесса запускаются одновременно.
Ну и пусть запускаются, хоть три. В чем проблема?
Потом ТС ничего не говорил про главный/не главный.
2 июн 21, 14:45    [22330360]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
alekcvp
Member

Откуда:
Сообщений: 2878
А если сделать dll-библиотеку со счётчиком и делать InterlockedIncrement() при DLL_PROCESS_ATTACH и InterlockedDecrement() при DLL_PROCESS_DETACH. А когда он станет равен 1 взводить какой-нибудь Event?..
2 июн 21, 14:55    [22330369]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53472

alekcvp
А если сделать dll-библиотеку со счётчиком

У библиотеки, загруженной в разные процессы, уже лет 25 как нет общего сегмента данных.

Posted via ActualForum NNTP Server 1.5

2 июн 21, 14:56    [22330373]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Barmaley57
Member

Откуда: Москва
Сообщений: 5866
alekcvp
InterlockedIncrement()
чего?
2 июн 21, 14:58    [22330374]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Barmaley57
Member

Откуда: Москва
Сообщений: 5866
Dimitry Sibiryakov

alekcvp
А если сделать dll-библиотеку со счётчиком

У библиотеки, загруженной в разные процессы, уже лет 25 как нет общего сегмента данных.
Они то как раз общие, пока читаешь. А потом COPY_ON_WRITE и усё
2 июн 21, 15:00    [22330376]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 755
YuRock
У меня идея такая, как вариант.
1. Пытаемся создать серверный сокет на определенный порт.
2. Если получилось - ты единственная (главная) программа.
3. Если не получилось - пытаемся подключиться к такому серверу. Подключились, и начинаем вечно чего-то ждать от сервера. Как придет ошибка (сервер закрылся) - возвращаемся в п. 1.
На локальных сокетах должно всё мгновенно отрабатывать по идее, даже если жОстко снять процесс сервера.

Лучше заменить на именованный пайп.
Плюс в том, что нет коллизии с другим софтом, который вдруг будет слушать именно этот порт.
Либо можно бродкастить UDP сообщения по типу UPNP протокола. Или сообщения рассылать (периодически пингуя главного)

Сообщение было отредактировано: 2 июн 21, 14:54
2 июн 21, 15:01    [22330378]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Virtual Student
Member

Откуда: Belarus
Сообщений: 347
Dimitry Sibiryakov

Virtual Student
Да, вроде, ничего сложного.

Только тамошний пример не имеет ничего общего с задачей топика...

Там и с mutex'ом пример в конце...
2 июн 21, 15:01    [22330379]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53472

Virtual Student
Там и с mutex'ом пример в конце...

Да хоть с чёртом с рогами. Покажите на пальцах как на семафоре и/или мутексе сделать
счётчик ссылок с сигнализацией достижения единицы или хотя бы нуля, устойчивый к
TerminateProcess.

Posted via ActualForum NNTP Server 1.5

2 июн 21, 15:03    [22330382]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Virtual Student
Member

Откуда: Belarus
Сообщений: 347
Fr0sT-Brutal
YuRock
У меня идея такая, как вариант.
1. Пытаемся создать серверный сокет на определенный порт.
2. Если получилось - ты единственная (главная) программа.
3. Если не получилось - пытаемся подключиться к такому серверу. Подключились, и начинаем вечно чего-то ждать от сервера. Как придет ошибка (сервер закрылся) - возвращаемся в п. 1.
На локальных сокетах должно всё мгновенно отрабатывать по идее, даже если жОстко снять процесс сервера.

Лучше заменить на именованный пайп.
Плюс в том, что нет коллизии с другим софтом, который вдруг будет слушать именно этот порт.
Либо можно бродкастить UDP сообщения по типу UPNP протокола.

Мдя...
2 июн 21, 15:03    [22330383]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Virtual Student
Member

Откуда: Belarus
Сообщений: 347
Dimitry Sibiryakov,
Создаем мьютекс:
Mutex:=OpenMutex(MUTEX_MODIFY_STATE,false,'Имя мьютекса');

Проверяем его владельца:
if Mutex = 0 then
  begin
    CloseHandle(Mutex);
    ShowMessage('Вместо этого делаем что хотим.');
    exit;
  end;

Или тебе необходимо точное количество запущенных копий приложения?
Вот еще ресурс по теме: https://streletzcoder.ru/rabota-s-myuteksami-v-stile-oop-delphi-tmutex/
2 июн 21, 15:16    [22330394]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65951
Блог
Virtual Student, и как это поможет прореагировать в тот момент, когда горец отрубит предпоследнюю голову?
2 июн 21, 15:19    [22330398]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4654
Virtual Student

if Mutex = 0 then
  begin
    CloseHandle(Mutex);
  end;

Так да, всё будет работать прекрасно, согласен.
2 июн 21, 15:21    [22330402]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
Все форумы / Delphi Ответить