Seite 1 von 3

prüfen ob programm schon läuft

Verfasst: 17.02.2005 17:06
von nicolaus
Hier mal ein beispiel wie man in seinem programm prüfen kann ob diese schon gestartet ist und wenn ja einen weiteren start nicht zulassen.

Code: Alles auswählen

OpenWindow(0,0,0,200,200,#PB_Window_SystemMenu,"Semaphor-test") 
ProcessIDServer.l 
hTargetSem.l = CreateSemaphore_(0, 0, 1, "SPT") ; semaphore erstellen 
If hTargetSem <> 0 ; prüfen ob semaphor schon im system vorhanden 
  If GetLastError_() = #ERROR_ALREADY_EXISTS ; semaphore is schon im system vorhanden 
    MessageRequester("Error","Tis Application is already running",0) 
    End 
  EndIf 
EndIf          

Repeat:Until WaitWindowEvent() = #PB_Event_CloseWindow
der string der bei CreateSemaphore_() als letzter parameter übergeben wird (in meinem beispiel "SPT") kann frei gewählt werden. man sollte nur bedenken das man versucht einen string zu wählen der nicht so einfach ist das er auch in einem anderen programm vorkommen könnte!
gruß nico

Verfasst: 17.02.2005 18:22
von glubschi90
Sehr praktisch! :D

Danke

Verfasst: 18.02.2005 00:20
von ts-soft
Ich finde es praktischer, wenn sowas als Procedur gepostet wird und hab nicolaus sein Code mal etwas umgestellt:

Code: Alles auswählen

Procedure OnlyOne(EinmaligerName.s)
  hTargetSem.l = CreateSemaphore_(0, 0, 1, @EinmaligerName); semaphore erstellen
  If hTargetSem <> 0 ; prüfen ob semaphor schon im system vorhanden
    If GetLastError_() = #ERROR_ALREADY_EXISTS ; semaphore is schon im system vorhanden
      MessageRequester("Error","Tis Application is already running",0)
      End
    EndIf
  EndIf
EndProcedure
OnlyOne("Ich bin einmalig")
OpenWindow(0,0,0,200,200,#PB_Window_SystemMenu,"Semaphor-test")

Repeat:Until WaitWindowEvent() = #PB_Event_CloseWindow

Verfasst: 18.02.2005 00:34
von ts-soft
Ich hätte da eigentlich noch ne frage: Kennt jemand den Unterschied, wenn man's mit Semaphore oder Mutex macht. Ich habs bisher immer mit Mutex gemacht. Einen Unterschied müßte es ja geben

Verfasst: 18.02.2005 10:48
von dige

Verfasst: 18.02.2005 11:36
von nicolaus
danke dige denn das hatte mich auch interesiert. wirklich guter link :allright:

Verfasst: 18.02.2005 17:06
von ts-soft
danke dige, netter link, obwohl so ganz verstanden hab ich's nicht :oops:

Verfasst: 18.02.2005 17:11
von Hroudtwolf
Ich finde die Methode von Freak besser !

Code: Alles auswählen

; English forum: http://purebasic.myforums.net/viewtopic.php?t=8244&highlight=
; Author: freak
; Date: 10. November 2003


; Procedure that will be called for each window... 
Procedure.l EnumProcedure(WindowHandle.l, Parameter.l) 
  
  ; get Title by windowhandle... 
  Title$ = Space(200) 
  aa=GetWindowText_(WindowHandle, @Title$, 200) 
  Debug title$
  Debug aa
  ; do whatever to check... 
  If FindString(Title$, "PureBasic", 1) <> 0 
  
    MessageRequester("","PB Editor found :)") 
  
    ; returning 0 will stop the search 
    ProcedureReturn 0 
  Else 
  
    ; returning <> 0 will continue till all windows are searched 
    ProcedureReturn 1 
  EndIf 
  
EndProcedure 

; find windows... 
EnumWindows_(@EnumProcedure(), 0)  ; the 0 will be passed in Paremeter.l to the procedure 

End

Verfasst: 18.02.2005 18:01
von 125
da brauchste aber nen window
was ist wennde nen Server Service schreibst?

Verfasst: 18.02.2005 18:12
von Hroudtwolf
:oops:
Stimmt ...muss ich dir recht geben !