powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Глобальный reference counter для нескольких процессов?
84 сообщений из 84, показаны все 4 страниц
Глобальный reference counter для нескольких процессов?
    #40074313
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Delphi-приложение может быть запущенно в нескольких экземлярах.
Например, запущено три.
Хочу решить такую задачу - мне нужно отреагировать в момент, когда пользователь закрывает два экземляра, и остается только один (последний).
Посоветуйте, в какую сторону копать? Хочется что-то вроде сабжа.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074319
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
семафоры
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074339
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КвейдПосоветуйте, в какую сторону копать?

MMF из свапа. Это даст тебе общую память, где ты можешь держать атомарный счётчик или
чёрта с рогами.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074559
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
семафоры, у них есть счетчик, глобальные на всю систему.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074562
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonсемафоры, у них есть счетчик, глобальные на всю систему

У них совсем плохо с сигнализацией достижения единицы. Да и с нулём не очень.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074645
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

а у MMF плохо с завершением - выпала программа, а твой счётчик не обновился.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074651
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,
OpenThread и WaitForObject. В каждой копии программы открываешь главный поток и ждешь его завершения. Как главный поток завершился, уменьшаешь счетчик. Таким образом каждая копия программы мониторит друг друга.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074656
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Надо именно ловить момент, когда экземпляр остается в одиночестве? Чтобы из реплики стать мастером? Может, event поможет? В мастере создается, реплики мониторят. Как только мастер закрывается, реплика создает event и становится мастером
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074695
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)выпала программа, а твой счётчик не обновился.

Поэтому нормальные программисты стараются писать программы, которые не выпадают.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074719
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
Пользователь прибил приложение и все счетчик не обновился.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074726
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При обычном прибитии приложению сначала посылается штатный WM_CLOSE. Чтобы счётчик не
обновился приложение должно либо зависнуть, либо прибитие нужно жёсткое, с
TerminateProcess, каковое для обычных пользователей слишком сложно, ибо делается с
"нипанятной" страница таскменеджера.

Ну и последующие глюки - тоже на его, пользователя, совести.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074776
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Ну и последующие глюки - тоже на его, пользователя, совести.

Приложение которое не защищено от нештатного завершения - это кривые руки программиста.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074782
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А цель-то какая?
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074855
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

kealon(Ruslan)выпала программа, а твой счётчик не обновился.

Поэтому нормальные программисты стараются писать программы, которые не выпадают.
стараться и написать - разные вещи, а вот спустить ответственность на пользователя - это непроффесионализм
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074867
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Электричество закончилось - тоже проблема пользователя?
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074868
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Электричество закончилось - тоже проблема пользователя?

Тогда счетчик уже не важен :)
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074869
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня идея такая, как вариант.
1. Пытаемся создать серверный сокет на определенный порт.
2. Если получилось - ты единственная (главная) программа.
3. Если не получилось - пытаемся подключиться к такому серверу. Подключились, и начинаем вечно чего-то ждать от сервера. Как придет ошибка (сервер закрылся) - возвращаемся в п. 1.
На локальных сокетах должно всё мгновенно отрабатывать по идее, даже если жОстко снять процесс сервера.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074870
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
YuRock
Электричество закончилось - тоже проблема пользователя?

Тогда счетчик уже не важен :)
А, ну да))
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074880
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Первый запущенный экземпляр открывает MMF и становится "главным".
2. Все последующие - проверяют MMF и регистрируют в главном экземпляре себя (например, отправкой сообщений в окно, указанное в MMF). Хэндл на MMF не держат открытым.
3. Главный экземпляр ждёт завершения всех зарегистрированных вторичных процессов.
4. Если главный процесс закрывается пользователем раньше вторичных - нужно себя отфинализировать полностью, но MMF не закрывать, ждать завершения всех вторичных, а потом грохнуться.
5. Событие "остается только один (последний) экземпляр" наступает, когда главный процесс дожидается завершения всех зарегистрированных вторичных. В этом случае последний экземпляр - главный. Либо, если главный уже логически финализирован, то когда он дождётся завершения всех, кроме одного вторичного. В этом случае последний экземпляр - оставшийся вторичный.

В качестве главного процесса можно использовать вспомогательный exe, чтобы не было необходимости закрывать его раньше вторичных.

Если вторичный процесс терминируется - главный об этом узнает. Если терминируется главный - ой. Как вариант: вторичные процессы тоже могут ждать завершения главного, и если он закрылся раньше вторичного - переизбрать главного среди вторичных (например, кто первее переоткроет MMF - того и тапки).
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074885
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker,

А если тупо создать два глобальных Mutex'a причём один захватывает первый запущенный экземпляр приложения, а следующий - отпускает. После чего все экземпляры приложения в отдельном потоке ждут на этих Mutex'ах. И если у какого-то экземпляра они оказываются оба, то он проверяет наличие других экземпляров (неважно как) и если не находит - профит. Ну и снова отпускает один Mutex. Только при запуске нового экземпляра надо сообщить об этом всем остальным, чтобы они начали ждать.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074898
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker

В качестве главного процесса можно использовать вспомогательный exe, чтобы не было необходимости закрывать его раньше вторичных.
а рабочие процессы, как вариант, запускать в job-е
там много что можно настроить
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074917
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уголок извращенца
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
unit loMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FMutex: array [0..1] of THandle;
    FEvent: THandle;
    FThread: TThread;
  public
    procedure WaitSingleInstance;
    procedure DoSingleInstance;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.DoSingleInstance;
begin
  ShowMessage('Single Instance!');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FEvent := CreateEvent(nil, True, False, nil);
  FMutex[0] := CreateMutex(nil, False, 'TLO_A');
  FMutex[1] := CreateMutex(nil, False, 'TLO_B');
  WaitSingleInstance;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  ThreadHandle: Thandle;
begin
  ThreadHandle := FThread.Handle;
  SetEvent(FEvent); //Killing thread
  WaitForSingleObject(ThreadHandle, INFINITE);
  CloseHandle(FEvent);
  { !!! Не закрываем хэндлы мьютексов! }
end;

procedure TForm1.WaitSingleInstance;
begin
  FThread := TThread.CreateAnonymousThread(

    procedure
    var
      IsSingleInstance: Boolean;
      hObjects: array of THandle;
    begin
      IsSingleInstance := True;
      hObjects := [FMutex[0], FMutex[1], FEvent];

      { Ждём получения первого мьютекса }
      case WaitForMultipleObjects(3, @hObjects[0], False, INFINITE) of

        WAIT_OBJECT_0,
        WAIT_ABANDONED_0:
          hObjects := [FMutex[1], FEvent];

        WAIT_OBJECT_0 + 1,
        WAIT_ABANDONED_0 + 1:
          hObjects := [FMutex[0], FEvent];

      else
        Exit;
      end;

      while WaitForSingleObject(FEvent, 0) = WAIT_TIMEOUT do
      begin

        { Ждём получения второго мьютекса }
        case WaitForMultipleObjects(2, @hObjects[0], False, 100) of

          WAIT_OBJECT_0,
          WAIT_ABANDONED_0:
            begin
              ReleaseMutex(hObjects[0]);
              if IsSingleInstance then
              begin
                Sleep(100);
                Continue;
              end;
            end;

          WAIT_TIMEOUT:
            begin
              IsSingleInstance := False;
              Continue;
            end

        else
          Exit;
        end;

        { Проверяем - перехватил ли кто-нибудь мьютекс? }
        if WaitForSingleObject(hObjects[0], 0) = WAIT_OBJECT_0 then
        begin
          IsSingleInstance := True;
          ReleaseMutex(hObjects[0]);
          TThread.Synchronize(nil, DoSingleInstance);
        end;

      end;
    end);

  FThread.Start;
end;

end.

...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074987
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каждый процесс создаёт в заведомо известном каталоге временный файл (флаг FILE_FLAG_DELETE_ON_CLOSE) и подписывается на изменения содержимого каталога.
Всё. Телемаркет.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40074995
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд
Посоветуйте, в какую сторону копать? Хочется что-то вроде сабжа.

Лично я, во-первых, посмотрел бы алгоритмы выбора мастера (ведущего из кучи равноправных нод итп), а во-вторых, намонстрячил бы небольшой протокол на RegisterWindowMessage/HWND_BROADCAST. Что-нибудь типа того:

а) сдыхающий мастер делает рассылку о выборах
б) каждый получивший отвечает рассылкой свежесгенерированного guid-а, выдавший наименьший считает себя мастером
в) усомнившийся в существовании других опять же делает рассылку о выборах (на случай тихо сдохшего мастера)
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075016
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот если организовать что-то такое:

1) простенькой COM-объект
2) и пусть каждое приложение создаёт себе его экземпляр
3) у COM-объекта пусть будет событие (не знаю, возможно такое), связанное с изменением числа инстансов и обработчик этого события и есть искомая фишка
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075027
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён
А вот если организовать что-то такое:

1) простенькой COM-объект
2) и пусть каждое приложение создаёт себе его экземпляр
3) у COM-объекта пусть будет событие (не знаю, возможно такое), связанное с изменением числа инстансов и обработчик этого события и есть искомая фишка
тоже самое что и в 22329725
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075033
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а где ТС?
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075039
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57
Каждый процесс создаёт в заведомо известном каталоге временный файл (флаг FILE_FLAG_DELETE_ON_CLOSE) и подписывается на изменения содержимого каталога.
Всё. Телемаркет.
Возможно, надо дополнить мысль: каждый процесс создает уникальный файл и, получая уведомления об изменении в ФС, считает кол-во файлов. Все форс-мажоры отдаются на откуп ОСи.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075042
Фотография Virtual Student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий

семафоры

+1
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075046
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне уже интересно: как это реализовать на семафорах? Раз плюсуют, значит знают способ...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075053
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор невовремя пропал, конечно.
Квейд
Хочу решить такую задачу - мне нужно отреагировать в момент,
когда пользователь закрывает два экземляра, и остается только один (последний).

Для этого reference counter не нужен.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075057
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
а где ТС?
Он своё дело сделал
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075059
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, это стародавний товарищ, а не тролль-новобранец. :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075060
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57
Barmaley57
Каждый процесс создаёт в заведомо известном каталоге временный файл (флаг FILE_FLAG_DELETE_ON_CLOSE) и подписывается на изменения содержимого каталога.
Всё. Телемаркет.
Возможно, надо дополнить мысль: каждый процесс создает уникальный файл и, получая уведомления об изменении в ФС, считает кол-во файлов. Все форс-мажоры отдаются на откуп ОСи.
Ситуация. Папка пустая. Два процесса запускаются одновременно.
Если будут считать файлы перед созданием своего - будут считать себя главными оба.
Если после - то оба будут считать себя НЕглавными (с большой вероятностью).
Каша какая-то, по нотификации изменений следить...
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075061
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
а где ТС?

Сделал всё на семафорах после первого коммента :)
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075062
Фотография Virtual Student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
Да, вроде, ничего сложного.
https://delphi.cjcsoft.net/viewthread.php?tid=47350
Семафор, он же именованный и уникальный для всей системы.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075065
Фотография Virtual Student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя я бы еще проще поступил (для твоей задачи). Возможно, это тупо...
Но просто писал бы реестр нужную циферку. А реестр, один фиг в памяти болтается. Так, что все весьма шустро.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075067
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Virtual StudentДа, вроде, ничего сложного.

Только тамошний пример не имеет ничего общего с задачей топика...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075069
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Ситуация. Папка пустая. Два процесса запускаются одновременно.
Ну и пусть запускаются, хоть три. В чем проблема?
Потом ТС ничего не говорил про главный/не главный.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075074
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если сделать dll-библиотеку со счётчиком и делать InterlockedIncrement() при DLL_PROCESS_ATTACH и InterlockedDecrement() при DLL_PROCESS_DETACH. А когда он станет равен 1 взводить какой-нибудь Event?..
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075078
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpА если сделать dll-библиотеку со счётчиком

У библиотеки, загруженной в разные процессы, уже лет 25 как нет общего сегмента данных.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075079
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
InterlockedIncrement()
чего?
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075081
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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

У библиотеки, загруженной в разные процессы, уже лет 25 как нет общего сегмента данных.
Они то как раз общие, пока читаешь. А потом COPY_ON_WRITE и усё
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075083
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRock
У меня идея такая, как вариант.
1. Пытаемся создать серверный сокет на определенный порт.
2. Если получилось - ты единственная (главная) программа.
3. Если не получилось - пытаемся подключиться к такому серверу. Подключились, и начинаем вечно чего-то ждать от сервера. Как придет ошибка (сервер закрылся) - возвращаемся в п. 1.
На локальных сокетах должно всё мгновенно отрабатывать по идее, даже если жОстко снять процесс сервера.

Лучше заменить на именованный пайп.
Плюс в том, что нет коллизии с другим софтом, который вдруг будет слушать именно этот порт.
Либо можно бродкастить UDP сообщения по типу UPNP протокола. Или сообщения рассылать (периодически пингуя главного)
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075084
Фотография Virtual Student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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

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

Там и с mutex'ом пример в конце...
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075085
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Virtual StudentТам и с mutex'ом пример в конце...

Да хоть с чёртом с рогами. Покажите на пальцах как на семафоре и/или мутексе сделать
счётчик ссылок с сигнализацией достижения единицы или хотя бы нуля, устойчивый к
TerminateProcess.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075086
Фотография Virtual Student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal
YuRock
У меня идея такая, как вариант.
1. Пытаемся создать серверный сокет на определенный порт.
2. Если получилось - ты единственная (главная) программа.
3. Если не получилось - пытаемся подключиться к такому серверу. Подключились, и начинаем вечно чего-то ждать от сервера. Как придет ошибка (сервер закрылся) - возвращаемся в п. 1.
На локальных сокетах должно всё мгновенно отрабатывать по идее, даже если жОстко снять процесс сервера.

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

Мдя...
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075096
Фотография Virtual Student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
Создаем мьютекс:
Код: pascal
1.
Mutex:=OpenMutex(MUTEX_MODIFY_STATE,false,'Имя мьютекса');


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


Или тебе необходимо точное количество запущенных копий приложения?
Вот еще ресурс по теме: https://streletzcoder.ru/rabota-s-myuteksami-v-stile-oop-delphi-tmutex/
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075100
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Virtual Student, и как это поможет прореагировать в тот момент, когда горец отрубит предпоследнюю голову?
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075104
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Virtual Student

Код: pascal
1.
2.
3.
4.
if Mutex = 0 then
  begin
    CloseHandle(Mutex);
  end;


Так да, всё будет работать прекрасно, согласен.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075107
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
У библиотеки, загруженной в разные процессы, уже лет 25 как нет общего сегмента данных.

Уголок извращенца #2
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
library instcounter;

uses
  WinAPI.Windows;

{$R *.res}

const
  S_EVENT = 'SI_CHECK';
  S_MEMORY = 'SI_COUNTER';

var
  InstanceCount: PInteger = nil;
  hSignalEvent: THandle = 0;
  hMapFile: THandle = 0;

procedure DllMain(Reason: Integer);
var
  Count: Integer;
begin
  if Reason = DLL_PROCESS_ATTACH then
  begin
    hMapFile := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(Integer), S_MEMORY);
    if hMapFile <> 0 then
      InstanceCount := MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(Integer));
    if InstanceCount <> nil then
      InterlockedIncrement(InstanceCount^);
  end else if Reason = DLL_PROCESS_DETACH then
  begin
    if InstanceCount <> nil then
    begin
      Count := InterlockedDecrement(InstanceCount^);
      UnmapViewOfFile(InstanceCount);
      if Count = 1 then
        SetEvent(hSignalEvent);
    end;
    CloseHandle(hMapFile);
  end;
end;

begin
  DllProc := DllMain;
  if hSignalEvent = 0 then
    hSignalEvent := CreateEvent(nil, False, False, S_EVENT);
  DllMain(DLL_PROCESS_ATTACH);
end.


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
unit siMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    FEvent: THandle;
    procedure AppIdle(Sender: TObject; var Done: Boolean);
    procedure DoSingleInstance;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.AppIdle(Sender: TObject; var Done: Boolean);
begin
  if WaitForSingleObject(FEvent, 0) = WAIT_OBJECT_0 then
    DoSingleInstance;
end;

procedure TForm1.DoSingleInstance;
begin
  ShowMessage('Single Instance!');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FEvent := CreateEvent(nil, False, False, 'SI_CHECK');
  if LoadLibrary(Pointer(ExtractFilePath(Application.ExeName) + 'instcounter.dll')) = 0 then
    RaiseLastOSError;
  Application.OnIdle := AppIdle;
end;

end.

...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075108
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp, MSDNIf you terminate a process by calling TerminateProcess or TerminateJobObject, the DLLs of that process do not receive DLL_PROCESS_DETACH notifications. If you terminate a thread by calling TerminateThread, the DLLs of that thread do not receive DLL_THREAD_DETACH notifications.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075109
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57,

Мда, печалько. Тогда первый вариант остаётся в силе 😃
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075110
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Код: pascal
1.
2.
3.
4.
5.
procedure TForm1.AppIdle(Sender: TObject; var Done: Boolean);
begin
  if WaitForSingleObject(FEvent, 0) = WAIT_OBJECT_0 then
    DoSingleInstance;
end;

Шик-модерн!
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075111
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DS> счётчик ссылок с сигнализацией

Для начала нужно уточнить, нужен ли этот счётчик.
Ибо для обозначенной в первом посте задачи он
нафиг не сдался.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075112
Фотография Virtual Student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,
Извиняйте господа, с форума другого стащил.
P.S.: Пивной выходной у меня сегодня... :)
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075113
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
DS> счётчик ссылок с сигнализацией

Для начала нужно уточнить, нужен ли этот счётчик.
Ибо для обозначенной в первом посте задачи он
нафиг не сдался.
Расшифруй мысль.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075128
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57> Расшифруй мысль.

Что там расшифровывать? Для решения задачи
"последнего выжившего оставшегося" счётчик
не нужен, совсем. Если, конечно, не хочется
где-нибудь в уголочке светить красненьким
"запущено 7 экз-в" и чтобы эта 7 была "живой".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075133
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
Barmaley57> Расшифруй мысль.

Что там расшифровывать? Для решения задачи
"последнего выжившего оставшегося" счётчик
не нужен, совсем. Если, конечно, не хочется
где-нибудь в уголочке светить красненьким
"запущено 7 экз-в" и чтобы эта 7 была "живой".
Мысль не ясна. Процессу надо узнать, что он остался один. Каков твой вариант?
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075142
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57> Процессу надо узнать, что он остался один. Каков твой вариант?

Именно, что один, а не "сдох предпредпоследний".

Например, захватываешь мьютекс и доволен, ты один.
Остальные (в отдельном потоке) ждут этого мьютекса.
Когда захватчик отпускает (или помирает) - просыпается
один из спящих, захватывает. Требований к очередности
захвата в стартовом посте не заявлено.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075148
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,ТСНапример, запущено три.
Хочу решить такую задачу - мне нужно отреагировать в момент, когда пользователь закрывает два экземляра, и остается только один (последний).
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075155
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpУголок извращенца #2

О, как внезапно "семафоры" превращаются в "shared memory + atomic counter"... А теперь
возвращаемся на первую страницу и перечитываем первые три сообщения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075174
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57> пользователь закрывает два экземляра,
Barmaley57> и остается только один (последний).

Это не проблема. Проблема, если закрывают два последних,
а "главный" (держатель мьютекса) ещё работает. В общем,
нужно уточнять, что и для чего ему нужно - наверняка, он
хочет "прибрать" за собой ресурсы или что-то вроде того.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075179
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

О, как внезапно "семафоры" превращаются в "shared memory + atomic counter"... А теперь
возвращаемся на первую страницу и перечитываем первые три сообщения.


1. Про семафоры я ничего не писал.
2. На первой странице я привёл работающее у меня решение на мьютексах.
3. Просто счётчик в Shared Memory не катит из-за аварийного завершения процессов. Я просто не знал, что для dll тоже не выхывается нотификация при убийстве процесса, так что это решение тоже не подходит.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075220
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57
Каждый процесс создаёт в заведомо известном каталоге временный файл (флаг FILE_FLAG_DELETE_ON_CLOSE) и подписывается на изменения содержимого каталога.
Всё. Телемаркет.
Красиво. Если отбросить проблему конфликтов, то решение самое работоспособное
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075259
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А теперь давайте все тоже самое - но кроссплатформенно.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075263
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov
А теперь давайте все тоже самое - но кроссплатформенно.
Я предлагал сокеты
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075346
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Rusov
А теперь давайте все тоже самое - но кроссплатформенно.

В Лине как раз временный файл по типу PID больше распространен. Да и там намного легче создать и юзать именованный файловый сокет
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40075369
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так подозреваю, граждане, что Квейд подался в партизаны...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40076091
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal
Надо именно ловить момент, когда экземпляр остается в одиночестве? Чтобы из реплики стать мастером?
Да
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40076094
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
а где ТС?
На связи
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40076096
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Мимопроходящий
а где ТС?

Сделал всё на семафорах после первого коммента :)
А если приложение будет завершено нестандартно, например через диспетчер задач - семафор будет освобожден?
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40076099
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
В общем,
нужно уточнять, что и для чего ему нужно - наверняка, он
хочет "прибрать" за собой ресурсы
Верно, именно так
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40076100
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
07.06.2021 13:29, Квейд пишет:
> Верно, именно так

ты задачу-то опиши.
а то народ и дальше будет городить огороды.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40076101
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
Автор невовремя пропал, конечно.
Квейд
Хочу решить такую задачу - мне нужно отреагировать в момент,
когда пользователь закрывает два экземляра, и остается только один (последний).

Для этого reference counter не нужен.


А если остается "последний", после чего пользователь опять запускает второй экземпляр, а первый - закрывает?
Не могу уложить в голове, как тогда обойтись без счетчика ссылок.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40076103
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий

07.06.2021 13:29, Квейд пишет:
> Верно, именно так

ты задачу-то опиши.
а то народ и дальше будет городить огороды.
Мне нужно чистить хитрый внешний ресурс при закрытии приложения, и есть условие что это надо делать только если в системе запущен один экземпляр программы.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40076106
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КвейдНе могу уложить в голове, как тогда обойтись без счетчика ссылок.

Проблема в том, что и счётчик ссылок тебе в этом случае не поможет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40076108
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

КвейдНе могу уложить в голове, как тогда обойтись без счетчика ссылок.

Проблема в том, что и счётчик ссылок тебе в этом случае не поможет.
Почему? Если счетчик равен единице, значит "мы последние". На первый взляд все просто. Что я мог пропустить?
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40076116
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КвейдЧто я мог пропустить?

Гонки потоков.

В твоём случае я бы вынес работу с "хитрым внешним ресурсом" в сервис, который всегда
один, а из приложений уже взаимодействовал с ним.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40076195
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

А если по таймеру из каждого инстанса мониторить список процессов, можно было бы поймать тот момент, когда определённый EXEшник остался один.

Если же не хочется привязываться к имени EXE файла, то можно было бы в каждом создать через AllocateHWnd невидимое окно со специфическими свойствами и периодически мониторить окна верхнего уровня.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40076211
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён
можно было бы поймать тот момент, когда определённый EXEшник остался один.
Можно. А в следующий тик их будет два
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40076385
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Кроик Семён
можно было бы поймать тот момент, когда определённый EXEшник остался один.
Можно. А в следующий тик их будет два

От этого ты никак не застрахуешься в обычной операционной системе. Разве что перед проверкой устанавливать какой-нибудь эвент, который запрещает запуск новых экземпляров.
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40076392
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
08.06.2021 13:48, alekcvp пишет:
> От этого ты никак не застрахуешься в обычной операционной системе.

в обычной операционной системе есть стандартные функции, дабы не заниматься велосипедированием.
но почему-то большинство участников дискуссии их предпочитают игнорировать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Глобальный reference counter для нескольких процессов?
    #40079604
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Квейд
Fr0sT-Brutal
Надо именно ловить момент, когда экземпляр остается в одиночестве? Чтобы из реплики стать мастером?
Да

Тогда см. дальше в том сообщении.
...
Рейтинг: 0 / 0
84 сообщений из 84, показаны все 4 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Глобальный reference counter для нескольких процессов?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]