2011-09-18 42 views
6

kullanarak izin ver Uygulamanın yalnızca 3 örneğini çalıştırmamı sağlayacak semaforları kullanarak basit bir yordam uygulamaya çalışıyorum. Ben 3 muteksleri kullanabilirsiniz ama bu ben şimdiye kadar Yalnızca 3 uygulama örneğini,

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; 

i düzgün yapabilirsiniz Bu nasıl çalıştı güzel bir yaklaşım değildir?

cevap

16

Her zaman bir semafor bıraktığınızdan emin olun, çünkü uygulamalarınız otomatik olarak bitmez.

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. 
+0

Harika kodlayıcı, harika bir cevap. Teşekkürler ! – opc0de

+0

+1 SyncObjs.TSemaphore'un zamanlanmış bekleyişleri karşılayamadığı bir hayal kırıklığı. Yoksa bir şey özledim mi? –

+0

D2007, SyncObjs.TSemaphore'a sahip bile değil ... XE'de doğru sizsiniz - Linux'taki zaman aşımı 0'da bekleyebilir, ancak Windows'da değil. Aptal – gabr

5

'u JCL'dan kullanabilirsiniz.

2
  1. Sen kilidi serbest olmalı, bu Sen bir sayım sonunda
  2. alabilirsiniz görmek için beklemek fonksiyonunun birini kullanmalıdır
  3. oluşturulup oluşturulmadığını görmek için denemek gerekir & o

Şerefe dahaki sefere kullanıcı yakın çalışmak ve uygulamanızı açabilmesi için işlemek

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; 
İlgili konular