Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Mutex ile birden fazla kullanıcıda aynı programın çalışmasını nasıl engelleriz
#1
Merhaba, başlıkta belirtiğim gibi Mutex ile uygulamanın birden fazla kez açılmasını engelleyebiliyoruz fakat uzak masaüstü ile farklı kullanıcılar aynı programın birden fazla kez kullanabiliyor ben bir kullanıcı da açıksa diğeri açamasın istiyorum.
http://www.delphiturkiye.com/forum/viewt...hp?t=20130 buradaki kodları projemde kullandım.

“Do. Or do not. There is no try.”
Cevapla
#2
Merhaba 
ilk öneri benden. Basit, sade çözümleri severim o bakımdan lambalı radyo tarzı bir önerim olacak.  Shy

Programın OnFormCreate eventinde bir ini dosyasına bakılsın, oradaki boolean değer ve kişinin oturum adı ile tarih saat kaydedilsin. Çıkarken de tersi yapılsın. Tarihsaat için sisteminiz aynı sistemin uzak masaüstü hali olduğundan senkron olacağını değerlendirerek yazıyorum.  Idea

Program çalışması terminate veya halt ile kırılma ihtimaline yönelik OnFormCreate olayında öncül aşama kontrol olarak kullanıcı aktif olup olmadığı kontrol edilsin. Ben olsam 30 sn'de bir ini dosyasına tarih saat güncellemesi yapardım, eğer kullanıcı oturum hala açık ama program kırılmışsa diye.

son güncellemeden 30 saniye geçmişse program kırılmış veya donmuş demek olduğunu anlar, kendi oturum adımızı ve tarihi yazma işlemini yapardım. 

Diğer kullanıcı INI dosyasına yazma arefesinde kendi kullanıcı adının silindiğini görünce o projenin kensini imha etmesini sağlardım. 

Bu mekanizma kurulunca geriye projenin donmaması ve zamanında ini dosya yazma işleminine sadık kalmasına engel olacak ihtimalleri araştırıp bertaraf etmek için çalışırdım ki ini işlemini thread altında ana uygulama kanalından izole yaptırmak en makulü.

Bir de şu imkanınız olur, bir kullanıcın programını kapatmasını istiyor ama ona ulaşamıyorsanız, ini dosyasına girer oturum adını silersiniz, bilirsiniz ki en geç 30 saniye içinde projesi kapanacak  Smile
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#3
Bende Projelerimde lisans da uzak masaüstü lisansı eklemiştim. Kaç Uzakmasaüstü lisansı girilecekse ks:= değerine atıyorum.

var
prgadi:string;
ks:integer;//kullanıcı sayısı

procedure TForm1.FormShow(Sender: TObject);
begin
prgadi:='programismi';//diğer programlarla çakışmaması için
end;

procedure TForm1.RestoreWindow;
var
  Wnd,
  App : HWND;
begin
 Wnd := FindWindow('ana', nil);
 if (Wnd <> 0) then
 begin // Set Window to foreground
   Messagebeep(0);
   App := GetWindowLong(Wnd, GWL_HWNDPARENT);
   if IsIconic(App) then ShowWindow(App, SW_RESTORE);
   SetForegroundwindow(App);
 end else
 begin
   MessageBeep(MB_ICONHAND);
   ana.MYMessageDlg('Bu Bilgisayarda İzin Verilen Sayıda Program Çalışıyor.Uzak Masaüstü Lisansı Alınız.',   mtError ,[mbok ],['Tamam'],mrok);
 end;
end;

procedure TForm1.kere;
var Semafor : THandle;
i,hata:integer;
begin
hata:=0;
for i:=1 to ks do
begin
 Semafor := CreateSemaphore(nil, 0, 1, pchar('Global\'+prgadi+inttostr(i)));

 if (Semafor <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then
 begin
   hata:=1;
   CloseHandle(Semafor);
 end else
begin
 hata:=0;
 if CreateMutex(nil, false, pchar('Global\'+prgadi+'id'+inttostr(i))) = 0 then RaiseLastOSError;
 if GetLastError  = ERROR_ALREADY_EXISTS then
 begin
   hata:=1;
 end;
end;
if hata=0 then break;
end;
if hata=1 then
   begin
   RestoreWindow;
   Application.Terminate;
   end;
end;
Cevapla
#4
Amacınız kullanıcı girişiyse program açılsın fakat login olamasın. Kullanıcılar login olduğunda veritabanına kayıt edip çıkış yaptığında düşürebilirsiniz
Cevapla
#5
@mrmarman hocam teşekkür ederim önerinizi kullanacağım
@elixir84 , @narkotik buraki amacım lisanslama v.b bir önlem için değil uygulama firebirde ki bir tabloyu dinleyip işlem yapıyor basit bir uygulama birden fazla kez açık olması deadlock v.b sorunlara neden olabiliyor bu yüzden önlem almak istedim

“Do. Or do not. There is no try.”
Cevapla
#6
Benden de pratik bir öneri gelsin madem. Bir Mutex'e isim verdiğinizde bu bir Local mutex olur. Yani sistem'de session bazlı yer alır. Ancak, mutex'e tüm sistemde geçerli olacak bir isim de verebilirsiniz. Sözün özü; mutex'e verdiğiniz ismin başına Global\ ibaresini getirirseniz; bu mutex sistem bazlı bir mutex olacaktır ve her session'dan görüntülenebilecektir. Wink

Şuradaki link'ten de gereken detayları alabilirsiniz. (Kardeş sitemizde bir kaç sene önce dile getirmişim)
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
Question Delphi formunu nasıl otomatik tam ekran yapabilirim ? erdemklt0 2 318 23-01-2026, Saat: 10:02
Son Yorum: csunguray
  TMS Web Core- REST İşlemlerini Nasıl Yapabilirim? kajmerantime 0 425 13-06-2025, Saat: 14:07
Son Yorum: kajmerantime
  Delphi 7 deki pencereleri nasıl sabitleyebilirim? mxpain 1 552 12-12-2024, Saat: 08:50
Son Yorum: 3ddark
  MdiChield formu aynı projede show ve showmodal ile çağırma nevzatc 6 1.007 07-12-2024, Saat: 19:08
Son Yorum: nevzatc
  resimdeki hatanin satirini nasil bulabiliriz. sadikacar60 6 1.110 25-11-2024, Saat: 19:18
Son Yorum: sadikacar60



Konuyu Okuyanlar: