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

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

+ Уголок извращенца #2

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.

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.
2 июн 21, 15:38    [22330409]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Barmaley57
Member

Откуда: Москва
Сообщений: 5866
alekcvp,
MSDN
If 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.
2 июн 21, 15:43    [22330410]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
alekcvp
Member

Откуда:
Сообщений: 2870
Barmaley57,

Мда, печалько. Тогда первый вариант остаётся в силе 😃
2 июн 21, 15:45    [22330412]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Barmaley57
Member

Откуда: Москва
Сообщений: 5866
alekcvp
procedure TForm1.AppIdle(Sender: TObject; var Done: Boolean);
begin
  if WaitForSingleObject(FEvent, 0) = WAIT_OBJECT_0 then
    DoSingleInstance;
end;
Шик-модерн!
2 июн 21, 15:45    [22330413]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 62803
DS> счётчик ссылок с сигнализацией

Для начала нужно уточнить, нужен ли этот счётчик.
Ибо для обозначенной в первом посте задачи он
нафиг не сдался.

Posted via ActualForum NNTP Server 1.5

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

Откуда: Belarus
Сообщений: 347
YuRock,
Извиняйте господа, с форума другого стащил.
P.S.: Пивной выходной у меня сегодня... :)
2 июн 21, 15:47    [22330416]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Barmaley57
Member

Откуда: Москва
Сообщений: 5866
Гаджимурадов Рустам
DS> счётчик ссылок с сигнализацией

Для начала нужно уточнить, нужен ли этот счётчик.
Ибо для обозначенной в первом посте задачи он
нафиг не сдался.
Расшифруй мысль.
2 июн 21, 15:50    [22330419]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 62803
Barmaley57> Расшифруй мысль.

Что там расшифровывать? Для решения задачи
"последнего выжившего оставшегося" счётчик
не нужен, совсем. Если, конечно, не хочется
где-нибудь в уголочке светить красненьким
"запущено 7 экз-в" и чтобы эта 7 была "живой".

Posted via ActualForum NNTP Server 1.5

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

Откуда: Москва
Сообщений: 5866
Гаджимурадов Рустам
Barmaley57> Расшифруй мысль.

Что там расшифровывать? Для решения задачи
"последнего выжившего оставшегося" счётчик
не нужен, совсем. Если, конечно, не хочется
где-нибудь в уголочке светить красненьким
"запущено 7 экз-в" и чтобы эта 7 была "живой".
Мысль не ясна. Процессу надо узнать, что он остался один. Каков твой вариант?
2 июн 21, 16:23    [22330447]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 62803
Barmaley57> Процессу надо узнать, что он остался один. Каков твой вариант?

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

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

Posted via ActualForum NNTP Server 1.5

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

Откуда: Москва
Сообщений: 5866
Гаджимурадов Рустам,
ТС
Например, запущено три.
Хочу решить такую задачу - мне нужно отреагировать в момент, когда пользователь закрывает два экземляра, и остается только один (последний).
2 июн 21, 16:49    [22330464]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Dimitry Sibiryakov
Member

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

alekcvp
Уголок извращенца #2

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

Posted via ActualForum NNTP Server 1.5

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

Откуда:
Сообщений: 62803
Barmaley57> пользователь закрывает два экземляра,
Barmaley57> и остается только один (последний).

Это не проблема. Проблема, если закрывают два последних,
а "главный" (держатель мьютекса) ещё работает. В общем,
нужно уточнять, что и для чего ему нужно - наверняка, он
хочет "прибрать" за собой ресурсы или что-то вроде того.

Posted via ActualForum NNTP Server 1.5

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

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

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


1. Про семафоры я ничего не писал.
2. На первой странице я привёл работающее у меня решение на мьютексах.
3. Просто счётчик в Shared Memory не катит из-за аварийного завершения процессов. Я просто не знал, что для dll тоже не выхывается нотификация при убийстве процесса, так что это решение тоже не подходит.

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

Откуда: Украина, Харьков
Сообщений: 12885
Barmaley57
Каждый процесс создаёт в заведомо известном каталоге временный файл (флаг FILE_FLAG_DELETE_ON_CLOSE) и подписывается на изменения содержимого каталога.
Всё. Телемаркет.
Красиво. Если отбросить проблему конфликтов, то решение самое работоспособное
2 июн 21, 19:31    [22330554]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2498
А теперь давайте все тоже самое - но кроссплатформенно.
2 июн 21, 22:06    [22330619]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4653
Maxim Rusov
А теперь давайте все тоже самое - но кроссплатформенно.
Я предлагал сокеты
2 июн 21, 22:30    [22330626]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 755
Maxim Rusov
А теперь давайте все тоже самое - но кроссплатформенно.

В Лине как раз временный файл по типу PID больше распространен. Да и там намного легче создать и юзать именованный файловый сокет
3 июн 21, 10:19    [22330760]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32387

я так подозреваю, граждане, что Квейд подался в партизаны...

Posted via ActualForum NNTP Server 1.5

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

Откуда: Kyiv, Ukraine
Сообщений: 5406
Fr0sT-Brutal
Надо именно ловить момент, когда экземпляр остается в одиночестве? Чтобы из реплики стать мастером?
Да
7 июн 21, 13:23    [22332251]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5406
Мимопроходящий
а где ТС?
На связи
7 июн 21, 13:25    [22332254]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5406
softwarer
Мимопроходящий
а где ТС?

Сделал всё на семафорах после первого коммента :)
А если приложение будет завершено нестандартно, например через диспетчер задач - семафор будет освобожден?
7 июн 21, 13:26    [22332257]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5406
Гаджимурадов Рустам
В общем,
нужно уточнять, что и для чего ему нужно - наверняка, он
хочет "прибрать" за собой ресурсы
Верно, именно так
7 июн 21, 13:29    [22332260]     Ответить | Цитировать Сообщить модератору
 Re: Глобальный reference counter для нескольких процессов?  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32387

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

ты задачу-то опиши.
а то народ и дальше будет городить огороды.

Posted via ActualForum NNTP Server 1.5

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

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

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


А если остается "последний", после чего пользователь опять запускает второй экземпляр, а первый - закрывает?
Не могу уложить в голове, как тогда обойтись без счетчика ссылок.
7 июн 21, 13:36    [22332264]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
Все форумы / Delphi Ответить