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


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