AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Semaphore Object funktioniert gar nicht ! wo ist der Fehler?
Thema durchsuchen
Ansicht
Themen-Optionen

Semaphore Object funktioniert gar nicht ! wo ist der Fehler?

Ein Thema von stoxx · begonnen am 8. Mär 2004 · letzter Beitrag vom 9. Mär 2004
 
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, 00: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz