Challenge 7
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Challenge 7
Hemen hemen hepimizin bazen yazdığımız bir uygulamanın birden fazla çalışmamasına ihtiyacımız olmuştur. Uygulamamızın ikinci bir kopyasının çalıştırılmasını istemediğimiz durumlar olmuştur. Ve bu isteğimizi Mutex'ler vasıtası ile rahat bir şekilde karşılayabiliyoruz.
Peki ya uygulamızdan sadece 2 kopya çalışmasını istese idik; nasıl bir kontrol yapmamız gerekir idi ? Yani abc.exe'nin sadece 2 kere çalıştırılmasını arzu ediyoruz.
Kurallar: Uygulamamız herhangi bir şekilde diske, registry'e çalışma sayısı ile ilgili bir bilgi yazamaz ve oradan okuyamaz.
Peki ya uygulamızdan sadece 2 kopya çalışmasını istese idik; nasıl bir kontrol yapmamız gerekir idi ? Yani abc.exe'nin sadece 2 kere çalıştırılmasını arzu ediyoruz.
Kurallar: Uygulamamız herhangi bir şekilde diske, registry'e çalışma sayısı ile ilgili bir bilgi yazamaz ve oradan okuyamaz.
Re: Challenge 7
EnumWindows ile pencereleri listelesek. Bu listede ana formumun class'ına uyanların sayısını alsak. Bu sayı 2 ise programın açılmasına izin vermesek?
There's no place like 127.0.0.1
Re: Challenge 7
kendimize ait iki adet atom belirler, atom'un var olup olmadigini check ederiz.
Atom1 var ve Atom2 yok ise, 1 adet program calisiyor demektir, ikincisine de access verilir.
Atom2 var ve Atom1 yok ise, yine b1 adet program calisiyor demektir, ikincisine de access verilir.
Atom1 ve Atom2 yok ise, program ilk defa calisacaktir, hem birincisine, hem de ikincisine access verilir.
Atom1 ve Atom2 var ise, iki program da calisiyor demektir, access verilmez.
Atom1 var ve Atom2 yok ise, 1 adet program calisiyor demektir, ikincisine de access verilir.
Atom2 var ve Atom1 yok ise, yine b1 adet program calisiyor demektir, ikincisine de access verilir.
Atom1 ve Atom2 yok ise, program ilk defa calisacaktir, hem birincisine, hem de ikincisine access verilir.
Atom1 ve Atom2 var ise, iki program da calisiyor demektir, access verilmez.
kıdemsiz üye
Re: Challenge 7
SimaWB yazdı:EnumWindows ile pencereleri listelesek. Bu listede ana formumun class'ına uyanların sayısını alsak. Bu sayı 2 ise programın açılmasına izin vermesek?


Re: Challenge 7
bunu görmemistim.thelvaci yazdı:Kurallar: Uygulamamız herhangi bir şekilde diske, registry'e çalışma sayısı ile ilgili bir bilgi yazamaz ve oradan okuyamaz.
baska alternatif gelmiyor aklima.
kıdemsiz üye
Re: Challenge 7
ikra yazdı:kendimize ait iki adet atom belirler, atom'un var olup olmadigini check ederiz.
Atom1 var ve Atom2 yok ise, 1 adet program calisiyor demektir, ikincisine de access verilir.
Atom2 var ve Atom1 yok ise, yine b1 adet program calisiyor demektir, ikincisine de access verilir.
Atom1 ve Atom2 yok ise, program ilk defa calisacaktir, hem birincisine, hem de ikincisine access verilir.
Atom1 ve Atom2 var ise, iki program da calisiyor demektir, access verilmez.


Re: Challenge 7
Gelir gelir biraz daha düşünikra yazdı:bunu görmemistim.thelvaci yazdı:Kurallar: Uygulamamız herhangi bir şekilde diske, registry'e çalışma sayısı ile ilgili bir bilgi yazamaz ve oradan okuyamaz.
baska alternatif gelmiyor aklima.

Re: Challenge 7
File Mapping ile yapılıyormuş 
CreateFileMapping, OpenFileMapping, MapViewOfFile....
Çözümü buldum ama örnek yazacak vakit yok

CreateFileMapping, OpenFileMapping, MapViewOfFile....
Çözümü buldum ama örnek yazacak vakit yok

There's no place like 127.0.0.1
-
- Üye
- Mesajlar: 216
- Kayıt: 10 Ara 2013 03:50
Re: Challenge 7
Merhaba,
RAM'de bir dosya oluşturup bu dosya ile çalışma sayısı artırılıp azaltılabilir. Aşağıdaki API'ler ile bu kontrol yapılabilir.
CreateFileMapping - dosyayı oluşturmak,
OpenFileMapping - var olan dosyayı okuma ve yazma için açmak
MapViewOfFile - dosyanın içeriğini okuma
UnmapViewOfFile - Dosyayı değiştirme ve kapatma
Dosya yoksa program henüz hiç çalışmamıştır. Dosyaya 1 değeri yazılır ve kapatılır. Eğer dosya varsa sayı okunur ve bir artırılıp kaydedilir. Programdan çıkarken de bu sayı bir azaltırılıp kaydedilir. Çıkarken eğer sayı 1 ise dosya silinir.
RAM'de bir dosya oluşturup bu dosya ile çalışma sayısı artırılıp azaltılabilir. Aşağıdaki API'ler ile bu kontrol yapılabilir.
CreateFileMapping - dosyayı oluşturmak,
OpenFileMapping - var olan dosyayı okuma ve yazma için açmak
MapViewOfFile - dosyanın içeriğini okuma
UnmapViewOfFile - Dosyayı değiştirme ve kapatma
Dosya yoksa program henüz hiç çalışmamıştır. Dosyaya 1 değeri yazılır ve kapatılır. Eğer dosya varsa sayı okunur ve bir artırılıp kaydedilir. Programdan çıkarken de bu sayı bir azaltırılıp kaydedilir. Çıkarken eğer sayı 1 ise dosya silinir.
Re: Challenge 7

Kısaca bir ipucu vereyim, örnek yapma işini de siz halledin. Semaphore

Bu arada gördüm ki, challange açar iken daha dikkatli olmalıymışım. Zehir gibi arkadaşlar, şu anda bu challange'ı deldiler



Re: Challenge 7
Ayrıca belirtmek isterim ki; Atom'ları ve FileMapping nesnelerini kullanır iken dikkatli olmalısınız. Bu tarz bir iş için yeterli işlevselliği sunmayabilirler. GlobalAddAtom ile eklenen bir atomun sistemden silinebilmesi için ilgili atom tablosunda referansının sıfıra erişmesi gerekir; dolayısı ile uygulamalar ilgili atom ile işleri kalmadığında GlobalDeleteAtom çağrımını yapmak zorundadırlar. Aynı şekilde; CreateFileMapping ile oluşturulan bir hafıza bölgesi; sizlerin de belirttiği gibi uygulamadan çıkılır iken güncellenmelidir. Ancak; bunlar kernel nesneleri olmadıkları için kontrol kullanıcı bazlıdır ve uygulamanız TerminateProcess yada ona benzer API'ler ile sonlandırılır ise istenmeyen sonuçları gözlemlersiniz. Atom kullanımında uygulamanız terminate edildiğinde GlobalDeleteAtom çağrımını yapamamış olursunuz ve atom tablosunda ilgili atomun referansı azaltılmamış şekilde kalır. Aynı şekilde FileMapping'de de ilgili hafıza bölgesini güncelleyememiş olursunuz.
Bu bilgileri de ek bir izahat olarak sunmak gerektiğini düşündüm.
Bu bilgileri de ek bir izahat olarak sunmak gerektiğini düşündüm.
Re: Challenge 7
Projemizin DPR dosyasını aşağıdaki şekilde yapıyoruz:
2 örnekten fazla çalıştırmak istersek hata mesajı gösterip kapanır.
Kod: Tümünü seç
uses
Forms, Windows, SysUtils, Dialogs,
Unit1 in 'Unit1.pas' {FormTest};
{$R *.res}
var
Semaphore: THandle;
begin
Semaphore := CreateSemaphore(nil, 2, 2, 'Semaphore-umBeniiiiiim:)');
if Semaphore <> 0 then
try
if WaitForSingleObject(Semaphore, 0) = WAIT_OBJECT_0 then
begin
try
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TFormTest, FormTest);
Application.Run;
finally
ReleaseSemaphore(Semaphore, 1, nil);
end;
end
else begin
ShowMessage('En fazla 2 örnek çalışabilir');
Exit;
end;
finally
CloseHandle(Semaphore);
end;
end.
There's no place like 127.0.0.1
Re: Challenge 7
Tebrik ederim hakikaten, bu kadar hızlı ve geniş cevaplar verileceğini beklemiyordum.SimaWB yazdı:Projemizin DPR dosyasını aşağıdaki şekilde yapıyoruz:2 örnekten fazla çalıştırmak istersek hata mesajı gösterip kapanır.Kod: Tümünü seç
uses Forms, Windows, SysUtils, Dialogs, Unit1 in 'Unit1.pas' {FormTest}; {$R *.res} var Semaphore: THandle; begin Semaphore := CreateSemaphore(nil, 2, 2, 'Semaphore-umBeniiiiiim:)'); if Semaphore <> 0 then try if WaitForSingleObject(Semaphore, 0) = WAIT_OBJECT_0 then begin try Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TFormTest, FormTest); Application.Run; finally ReleaseSemaphore(Semaphore, 1, nil); end; end else begin ShowMessage('En fazla 2 örnek çalışabilir'); Exit; end; finally CloseHandle(Semaphore); end; end.

Gördüğünüz gibi ne kadar da kolaymış değil mi
