 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 18.01.2015, 10:05 Titel: 2. gleiche Programme nicht starten. |
|
|
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 |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 18.01.2015, 11:52 Titel: |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4701 Wohnort: ~/
|
Verfasst am: 18.01.2015, 13:23 Titel: |
|
|
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.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1279 Wohnort: Ruhrpott
|
Verfasst am: 18.01.2015, 16:03 Titel: |
|
|
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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 18.01.2015, 17:04 Titel: |
|
|
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 |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 18.01.2015, 19:16 Titel: |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4701 Wohnort: ~/
|
Verfasst am: 18.01.2015, 19:27 Titel: |
|
|
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 |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1279 Wohnort: Ruhrpott
|
Verfasst am: 19.01.2015, 11:02 Titel: |
|
|
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 |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1279 Wohnort: Ruhrpott
|
Verfasst am: 20.01.2015, 12:46 Titel: |
|
|
@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 |
|
 |
|
|
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.
|
|