Allow only 3 instances of an application using semaphores

时间秒杀一切 提交于 2019-12-03 07:36:57

Always make sure that you release a semaphore because this is not done automatically if your application dies.

program Project72;

{$APPTYPE CONSOLE}

uses
  Windows,
  SysUtils;

var
  hSem: THandle;

begin
  try
    hSem := CreateSemaphore(nil, 3, 3, 'C15F8F92-2620-4F3C-B8EA-A27285F870DC/myApp');
    Win32Check(hSem <> 0);
    try
      if WaitForSingleObject(hSem, 0) <> WAIT_OBJECT_0 then
        Writeln('Cannot execute, 3 instances already running')
      else begin
        try
          // place your code here
          Writeln('Running, press Enter to stop ...');
          Readln;
        finally ReleaseSemaphore(hSem, 1, nil); end;
      end;
    finally CloseHandle(hSem); end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

You could use TJclAppInstances from the JCL.

  1. You must try to see if it was created
  2. You must use one of the wait function to see if you can get a count
  3. At the end, you must release the lock & handle so that it can work the next time user close and open your app

Cheers

var
  hSem: THandle;
begin
  hSem := OpenSemaphore(nil, SEMAPHORE_ALL_ACCESS, True, 'MySemp3');
  if hSem = 0 then
    hSem := CreateSemaphore(nil, 3, 3,'MySemp3');

  if hSem = 0 then
  begin
    ShowMessage('... show the error');
    Halt(1);
    Exit;     
  end;

  if WaitForSingleObject(hSem, 0) <> WAIT_OBJECT_0 then
  begin
    CloseHandle(hSem);
    ShowMessage('Application can be runed only 3 times at once');
    Halt(1);
    Exit; 
  end;

  try   
    your application.run codes..

  finally
    ReleaseSemaphore(hSem, 1, nil);
    CloseHandle(hSem);
  end; 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!