Einzelnen Beitrag anzeigen

Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#5

Re: Semaphore Object funktioniert gar nicht ! wo ist der Feh

  Alt 9. Mär 2004, 01:46
ach mensch

Das funktioniert nicht so, wie ich will.
Es geht darum, dass zwar das Programm an sich zweimal gestartet werden kann.
In diesem Programm gibt es aber ein Modul, was nur einmal laufen soll.
Wenn also in dem einem Programm das Formular gerade angezeigt wird, soll es in dem anderen Programm nicht angezeigt werden können.

Dafür hab ich folgendes getan:
Eine Procedure, die prüft, ob es das Fenster schon aktiv ist.
Wenn nicht schon selbst gestartet, dann prüfen ob ein Semaphore Object der anderen Instanz des Programms existiert.



Code:
var
  FormTS: TFormTS;
  hSem : THandle = 0;


implementation

{$R *.dfm} 

/////////////////////////////////////////////////////////////////////////////////// 


class function TFormTS.bereitsaktiv : boolean;
begin
 result := true;
 if hsem <> 0 then result := true else // dann schon selber gestartet
 begin
 // prüfen ob andere Instanz des Programms dieses Modul geöffnet hat
 hSem := CreateSemaphore(nil,0,1,PCHAR('TS'));
  if (hSem <> 0) and (GetLastError() = ERROR_ALREADY_EXISTS) then
   result := true else result := false;
 end;
end;

Der Aufruf erfolgt so: Und soll korrekt anzeigen, ob das Modul schon geladen ist.


Code:
///////////////////////////////////////////////////////////////////////////////////// 
procedure TFormMain.Automatisierung1Click(Sender: TObject);
begin
if TFormTS.bereitsaktiv then
 MessageDlg('bereits aktiv !', mtWarning, [mbOK], 0)
else
 FormTS.show;
end;


im Formclose des Forms steht folgendes.

Code:
if hsem <> 0 then
 begin
   CloseHandle(hsem);
   hsem := 0;
 end;

und nun passiert folgendes:

in der einen laufenden Programm Instanz zeige ich das Fenster.
Wenn ich in der anderen laufenden Instanz des Programms dies nun auch tun will, zeigt er völlig korrekt die Meldung, dass es bereits aktiv wäre.
Wenn ich nun in dem anderen Programm das Fenster schließe, lässt sich ein keiner Der Versionen das Fenster wieder öffnen.
Wichtig bei diesem Test ist, dass man einen Check bei gerade geöffnetem Fenter machen muss !
hmmm
  Mit Zitat antworten Zitat