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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В качестве главного процесса можно использовать вспомогательный exe, чтобы не было необходимости закрывать его раньше вторичных.
а рабочие процессы, как вариант, запускать в job-е
там много что можно настроить
...
Рейтинг: 0 / 0
02.06.2021, 02:17
    #40074917
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальный reference counter для нескольких процессов?
Уголок извращенца
Код: 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
02.06.2021, 12:06
    #40074987
Barmaley57
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальный reference counter для нескольких процессов?
Каждый процесс создаёт в заведомо известном каталоге временный файл (флаг FILE_FLAG_DELETE_ON_CLOSE) и подписывается на изменения содержимого каталога.
Всё. Телемаркет.
...
Рейтинг: 0 / 0
02.06.2021, 12:28
    #40074995
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальный reference counter для нескольких процессов?
Квейд
Посоветуйте, в какую сторону копать? Хочется что-то вроде сабжа.

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

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

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


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