Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

2. gleiche Programme nicht starten.

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 18.01.2015, 10:05    Titel: 2. gleiche Programme nicht starten. Antworten mit Zitat

Hallo, guten Tag.

Ich hab ein Programm mit Freebasic erstellt.

Dieses soll nicht mehrmals gestartet werden können.
Was muss man machen , damit es nur einmal gestartet werden kann?

danke.

Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 18.01.2015, 11:52    Titel: Antworten mit Zitat

Hi,
eine Lösung, die aber nur unter Windows funktioniert:
Code:
#Include Once "windows.bi"

Sub Single_Instance
   'Prüft ob Programm schon läuft
   Dim As HANDLE mHandle = CreateMutex(0, 1, "ardunos Programm")
   If GetLastError = ERROR_ALREADY_EXISTS Then
      MessageBox 0, "Programm läuft schon!", "Achtung:", MB_OK Or MB_ICONSTOP
      ReleaseMutex(mHandle)
      If mHandle Then CloseHandle(mHandle)
      End 0
   EndIf
End Sub

Single_Instance
Sleep
Wird dieses Programmteil ein zweites mal gestartet erkennt es das ein Mutex ("ardunos Programm") schon existiert und bricht ab.
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4701
Wohnort: ~/

BeitragVerfasst am: 18.01.2015, 13:23    Titel: Antworten mit Zitat

Unter Linux (mit Windows funktioniert es natürlich auch) wird häufig eine Lock-Datei angelegt. Das Programm überprüft beim Start, ob diese Datei existiert, und beendet sich dann gegebenenfalls. Ansonsten wird die Datei angelegt und beim Programmende wieder gelöscht.

Nachteil ist, dass bei einem gewaltsamen Programmende (Absturz oder Abschuss) die Lock-Datei bestehen bleibt und von Hand gelöscht werden muss. Der Benutzer sollte, wenn er das Programm startet und die Datei bereits existiert, darauf hingewiesen werden.

Was auch funktionieren könnte: in die Lock-Datei die Nummer des Programmprozesses schreiben. Existiert die Datei, prüft das Programm zuerst, ob ein Prozess mit dieser Nummer existiert - wenn ja, gibt es dem System die Anweisung, dieses Fenster in den Vordergrund zu holen; wenn nein, löscht es die Datei und legt sie neu an.

Die Lock-Datei schützt natürlich nicht vor Benutzern, die mutwillig die Datei löschen, um das Programm ein zweites Mal starten zu können; aber solche Leute sind auch selbst schuld. happy
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1279
Wohnort: Ruhrpott

BeitragVerfasst am: 18.01.2015, 16:03    Titel: Antworten mit Zitat

Es gibt noch eine andere Möglichkeit, ebenfalls nur für Windows und etwas komplizierter als Voltas Methode, aber dafür kannst du auch auf andere (auch fremde) Programme testen (einfach DieseDatei durch den Namen des gesuchten Programms ersetzen), und du kannst eine beliebige Höchstzahl von Instanzen festlegen.
Code:
#Include Once "windows.bi"
#include "win/tlhelp32.bi"

Dim As HANDLE snapshothandle
Dim As PROCESSENTRY32 prozessantwort
Dim As Integer instanzen
Dim As ZString*MAX_PATH DieseDatei

GetModuleFileName(0,@DieseDatei,MAX_PATH) 'kompletten pfad dieses programms ermitteln
DieseDatei = Mid(DieseDatei,InStrRev(DieseDatei,"\") + 1) 'programmnamen extrahieren

snapshothandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0) 'handle für systemschnappschuß erstellen
prozessantwort.dwSize = SizeOf(prozessantwort) 'größe der datenstruktur für antwort übergeben
Process32First(snapshothandle,@prozessantwort) 'ersten prozesshandle suchen (ist SYSTEM IDLE PROCESS)
Do While Process32Next(snapshothandle, @prozessantwort) 'alle prozesse durchsuchen
   instanzen += IIf(prozessantwort.szExeFile = DieseDatei,1,0) 'erhöhen, wenn prozess zur gesuchten datei gehört
Loop
CloseHandle(snapshothandle) 'ressourcen freigeben
If instanzen > 1 Then End 'maximal erlaubte anzahl von instanzen

Print "OK"
Sleep


Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 18.01.2015, 17:04    Titel: Antworten mit Zitat

Der Nachteil der Variante ist natürlich auch, dass zwei identisch benannte Programme sich ins Gehege kommen werden.
An sich ist nemoreds Lösung die portabelste und einfachste. Ich weiß nicht ob FB exklusive Schreibrechte für eine Datei erfordert, aber wenn das so ist, kann man einfach die Lock-Datei geöffnet lassen und wenn dann eine weitere Instanz sie öffnen möchte, wird sie dabei scheitern. Dann bereitet auch ein Programmabsturz keine Probleme.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 252

BeitragVerfasst am: 18.01.2015, 19:16    Titel: Antworten mit Zitat

Jup danke.

Wie kann ich das bitte hier das Einfache einbauen:
Code:

#Define WIN_INCLUDEALL
#Include "windows.bi"
#Include "fbgfx.bi"
#include "vbcompat.bi"
Using FB

Declare Function file_getname( ByVal hWnd As HWND ) As String

Declare Sub datei_laden()
Declare Sub vga_dat()
Declare Sub vga_nibble()
Declare Sub bild_zeigen()

SCREENRES 660,340, 32
ScreenControl SET_WINDOW_POS, 900, 480

DIM Shared As INTEGER bin_menge
Dim Shared As BYTE PTR daten
Dim Shared bildhin As Any Ptr
Dim Shared bild As Any Ptr
DIM Shared As STRING bin_name
DIM Shared taste AS STRING

Dim Shared As Integer breit, hoch
Dim Shared As Integer x,y,yy,byteinhalt,byte_w,col,adr
Dim Shared As INTEGER ff

Dim Shared As HWND hWnd
Dim Shared As String datei_komplett,datei_endung,datei
Dim Shared As Integer laenge,laenge1

bildhin = ImageCreate(640,240)
bin_menge = 19200
daten = ALLOCATE(bin_menge)
ff = FreeFile
adr=0

COLOR &hff0000,RGB(220,220,220)
cls

Locate 2,2
Print "1 = Grafik laden "
Locate 4,2
Print "2 = vga-dat"
Locate 6,2
Print "3 = vga-nibble"

Do   
   taste = InKey
   IF taste = CHR(255, 107) THEN End
   
   If MULTIKEY(FB.sc_1) Then
      Locate 10,2
      Print "                 "
      datei_laden()
      bild_zeigen()
   EndIf
   
   If MULTIKEY(FB.sc_2) Then
      If datei >"" Then
         vga_dat()
         Locate 10,2
         Print "fertig...daten"
      EndIf
   EndIf
   
   If MULTIKEY(FB.sc_3) Then
      If datei >"" Then
         vga_nibble()
         Locate 10,2
         Print "fertig...nibble"
      EndIf
   EndIf
   
   Sleep 1
Loop
DEALLOCATE( daten )
End

Sub bild_zeigen()
   Open datei_komplett For Binary As #ff
   Get #ff, 19, breit
   Get #ff, 23, hoch
   Close #ff

   bild = ImageCreate(breit,hoch)
   Bload datei_komplett, bild
   Put bildhin,(0,0),bild,PSet
   Put (10,90),bildhin,PSet
End Sub

Sub vga_dat()
   adr=0
   For y = 0 To 239 Step 8
      For x = 0 To 79
         For yy=0 To 7
            byteInhalt = 0
            For byte_w = 0 To 7
               col = Point(x * 8 + 7 - byte_w, y+yy ,bildhin)
               If (col AND &Hffffff)= &hFFFFFF Then
                  byteInhalt = Bitset(byteInhalt,byte_w)
               EndIf
            Next
            daten[adr]=byteInhalt
            adr=adr+1
         next
      Next
   Next

   Open "d:\altera\prog\"+datei+".dat" For BINARY AS #ff
   Put #ff , , *daten, bin_menge
   Close #ff
   
   datei=""
End Sub

Sub vga_nibble()
   adr=0
   For y = 0 To 239 Step 8
      For x = 0 To 79
         For yy=0 To 7
            byteInhalt = 0
            For byte_w = 0 To 7
               col = Point(x * 8 + 7 - byte_w, y+yy ,bildhin)
               If (col AND &Hffffff)= &hFFFFFF Then
                  byteInhalt = Bitset(byteInhalt,byte_w)
               EndIf
            Next
            
            byteInhalt = (byteInhalt AND &b00010001) SHL 3  _
            Or ((byteInhalt AND &b00100010) SHL 1) _
            Or ((byteInhalt AND &b01000100) SHR 1) _
            Or ((byteInhalt AND &b10001000) SHR 3)
           
            daten[adr]=byteInhalt
            adr=adr+1
         next
      Next
   Next

   Open "d:\altera\prog\n_"+datei+".dat" For BINARY AS #ff
   Put #ff , , *daten, bin_menge
   Close #ff
   
   datei=""
End Sub

Sub datei_laden()
   datei_komplett = file_getname(hWnd)
   laenge = InStrRev(datei_komplett, "\")
   datei_endung = Mid(datei_komplett, laenge+1)
   laenge1=Len(datei_endung)
   datei=Mid(datei_endung,1,laenge1-4)
End Sub

Function file_getname( ByVal hWnd As HWND ) As String
   Dim ofn As OPENFILENAME
   Dim filename As ZString * MAX_PATH+1

   With ofn
      .lStructSize       = SizeOf( OPENFILENAME )
      .hwndOwner          = hWnd
      .hInstance          = GetModuleHandle( NULL )
      .lpstrFilter       = StrPtr( !"All Files" )
      .lpstrCustomFilter    = NULL
      .nMaxCustFilter    = 0
      .nFilterIndex       = 1
      .lpstrFile         = @filename
      .nMaxFile         = SizeOf( filename )
      .lpstrFileTitle      = NULL
      .nMaxFileTitle      = 0
      .lpstrInitialDir   = NULL
      .lpstrTitle         = @"File Open Test"
      .Flags            = OFN_EXPLORER Or OFN_FILEMUSTEXIST Or OFN_PATHMUSTEXIST
      .nFileOffset      = 0
      .nFileExtension      = 0
      .lpstrDefExt      = NULL
      .lCustData         = 0
      .lpfnHook         = NULL
      .lpTemplateName      = NULL
   End With

   If( GetOpenFileName( @ofn ) = FALSE ) Then
      Return ""
   Else
      Return filename
   End If
End Function


Danke.

Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4701
Wohnort: ~/

BeitragVerfasst am: 18.01.2015, 19:27    Titel: Antworten mit Zitat

Zitat:
Ich weiß nicht ob FB exklusive Schreibrechte für eine Datei erfordert

Habe ich unter Linux gerade mal getestet - ich kann von zwei FB-Programmen gleichzeitig auf dieselbe Datei schreibend zugreifen. Ein OPEN...LOCK (READ) WRITE ändert daran leider auch nichts. Ist wohl unter Windows dasselbe (http://www.freebasic.net/forum/viewtopic.php?t=17660)
Zur Anweisung LOCK selber: da war der letzte Stand der Dinge, dass sich das wohl überhaupt nicht so implementieren lässt wie in der Referenz beschrieben ...

Zitat:
Wie kann ich das bitte hier das Einfache einbauen

Das Programm überprüft beim Start, ob diese Datei existiert (FILEEXISTS), und beendet sich dann gegebenenfalls (END). Ansonsten wird die Datei angelegt (OPEN FOR OUTPUT) und beim Programmende wieder gelöscht (KILL).
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1279
Wohnort: Ruhrpott

BeitragVerfasst am: 19.01.2015, 11:02    Titel: Antworten mit Zitat

arduno hat Folgendes geschrieben:
Wie kann ich das bitte hier das Einfache einbauen:

Ganz am Anfang im Hauptprogramm:
Code:
...
Dim Shared As HWND hWnd
Dim Shared As String datei_komplett,datei_endung,datei
Dim Shared As Integer laenge,laenge1

Dim As HANDLE mHandle = CreateMutex(0, 1, "ardunos Programm")
If GetLastError = ERROR_ALREADY_EXISTS Then
  MessageBox 0, "Programm läuft schon!", "Achtung:", MB_OK Or MB_ICONSTOP
  ReleaseMutex(mHandle)
  If mHandle Then CloseHandle(mHandle)
  End 0
EndIf

bildhin = ImageCreate(640,240)
bin_menge = 19200
daten = ALLOCATE(bin_menge)
...


Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1279
Wohnort: Ruhrpott

BeitragVerfasst am: 20.01.2015, 12:46    Titel: Antworten mit Zitat

@nemored:
In Linux gibt es doch sicher auch so etwas wie Shared memory. Das könnte man doch anstelle einer Lockdatei benutzen, um die Meldung "Ich laufe schon" zu hinterlegen, mit dem Vorteil, daß es mit Beenden des Programms, spätestens jedoch beim nächsten Systemstart, wieder verschwunden ist.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz