prüfen ob programm schon läuft

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

prüfen ob programm schon läuft

Beitrag 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
glubschi90
Beiträge: 274
Registriert: 04.09.2004 01:43
Wohnort: Würzburg

Beitrag von glubschi90 »

Sehr praktisch! :D

Danke
PureBasic 4.30
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Beitrag von dige »

"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

danke dige denn das hatte mich auch interesiert. wirklich guter link :allright:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

danke dige, netter link, obwohl so ganz verstanden hab ich's nicht :oops:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Hroudtwolf
Beiträge: 1416
Registriert: 30.10.2004 23:33
Kontaktdaten:

Beitrag 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
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

da brauchste aber nen window
was ist wennde nen Server Service schreibst?
Benutzeravatar
Hroudtwolf
Beiträge: 1416
Registriert: 30.10.2004 23:33
Kontaktdaten:

Beitrag von Hroudtwolf »

:oops:
Stimmt ...muss ich dir recht geben !
Antworten