Zarządzanie kopiami programu

0

Witam
Piszę aplikacje której jedną z możliwości będzie wykrywanie uruchomionej kopi samej siebie.
Chodzi o to że mam aplikacje o nazwie np. X i teraz gdy ta aplikacja zostanie uruchomiona np 5 razy to ta co została jako pierwsza uruchomiona działa normalnie
a pozostałe 4 przechodzą w stan oczekiwania jeśli zostanie zamknięta apikacja aktywna to uaktywnia się któraś z tych czterech a pozostałe trzy dalej czekają itd.

Problem polega na tym że wiem jak zrobić aby program wykrył ze uruchomiona juz jest jego kopia
ale nie wiem jak w momencie wyłączenia aplikacji aktywnej wykryć to zdarzenia
właściwie to mi się to nawet udało używając klasy TATOM ale tam musze przy konczeniu aplikacji zwalniać pamięć i wtedy wszystko działa gorzej gdy aplikacja zostanie zamknięta z błędem tzn się po prostu wysypie
lub zostanie wyłączona w sposób nagły np z menagera zadań wtedy nie występuje zdarzenie OnDestroy a to w nim umieściłem owe zwolnienie pamięci.

Wymyśliłem też system polegający na rozsyłaniu komunikatu tzn
aplikacja aktywna wysyła komunikat w taki sposób

procedure TForm1.komsendTimer(Sender: TObject);
var
  H : THandle; // zmienna przechowująca uchwyt
begin
  H := FindWindow(nil,'X SYSTEM');// szukanie okna...
  PostMessage(H,X_KOM, 1, 1);// wysłanie komunikatu
end;

i odbieram go przez aplikacje
jesli ona nie wykryje przesłania komunikatu to przechodzi w tryb aktywny a jak wykryje to pozostaje w stanie oczekiwania

i tak w kółko
tyle że to rozwiązanie ma tęż wadę
jeśli jakieś okno to przechwyci to komunikat ginie czyli efekt jest taki ze jak uruchomie 5 aplikacji to 5 przechodzi w tryb aktywny bo praktycznie komunikat jest przechwytywany nawet jak aplikacja jest w trybie aktywnym

Pytanie brzmi tak
Czy istnieje jakiś lepszy sposób na ten problem?
Czy da się wysłać komunikat który edzie dotyczył wszystkich okien o dane nazwie ?

Proszę o pomoc i Pozdrawiam

0

po za atomem sa jeszcze mutexy i semafory:
http://www.swissdelphicenter.ch/torry/showcode.php?id=42
ale przyznam sie - nie wiem jak jest z ich kasowaniem i czy po wysypaniu aplikacji dalej istnieja, poszukaj.
mozesz tez zrobic tak, ze:
zalozmy ze twoj program to "myapp.exe"...
robisz liste wszystkich procesow "myapp.exe" i ustawiasz aby proces o najmniejszym PIDzie byl aktywny a reszta spala. trzeba tylko pamietac ze moga istniec dwa procesy nie bedace tym samym plikiem (np pliki exe o tych samych nazach lecz w roznych katalogach) wiec lepiej sie pred tym zabezpieczyc i uwzgledniac tez sciezke programu.
tak samo mozna to rozwiac na oknach (robi liste okien o podanej nazwie i klasie, i te o najmniejszym handle bedzie ustawione jako aplikacja dzialajaca, reszta niech spi).
przy takim rozwiazaniu nie musisz sie martwic o komunikacje ;]

0

Hehe metoda z oknami okazała sie skuteczna :-)
Dzięki za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1