powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Глобальный reference counter для нескольких процессов?
25 сообщений из 84, страница 1 из 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
25 сообщений из 84, страница 1 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Глобальный reference counter для нескольких процессов?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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