delphi - 只允许应用程序有 3 个使用信号量的实例

标签 delphi semaphore

我正在尝试使用信号量实现一个简单的例程,这将允许我仅运行该应用程序的 3 个实例。我可以使用 3 个互斥锁,但这不是一个好方法,到目前为止我已经尝试过了

var
  hSem:THandle;
begin
  hSem := CreateSemaphore(nil,3,3,'MySemp3');
  if hSem = 0 then
  begin
    ShowMessage('Application can be run only 3 times at once');
    Halt(1);
  end;

我怎样才能正确地做到这一点?

最佳答案

始终确保释放信号量,因为如果您的应用程序终止,这不会自动完成。

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.

关于delphi - 只允许应用程序有 3 个使用信号量的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7460943/

相关文章:

objective-c - dispatch_semaphore_t 重用-我在这里缺少什么?

delphi - 组件是特定类 - 在 BPL 结构中不起作用

delphi - 仅关闭一小部分代码的 Delphi 范围检查

delphi - 为什么使用运行时包构建会使 EXE 文件更小?

go - 有没有更好的方法限制 "door"的请求?

assembly - 迷你操作系统中针对不同信号量的现成队列的优缺点

c - 在信号量中排队 - 甚至可能吗?

database - 防止模拟银行数据库中的死锁

delphi - 为什么 `as` 运算符可能会抛出令人讨厌的 EAccessViolation 而不是正常的 EIntfCastError ?

delphi - 除了 "packed"记录之外什么都没有——我应该修复它吗?