![]() |
Re: Doppelten Start eines Programmes verhindern
Zitat:
|
Re: Doppelten Start eines Programmes verhindern
Zitat:
Das Halt kommt ja noch vor einem Application.Initialize; (bei einer VCL-Anwendung)... Gruß, Christoph |
Re: Doppelten Start eines Programmes verhindern
Zitat:
Wenn zweiteres, bitte erläutere doch mal genauer, was genau man da Windows zerschiessen könnte mit einem Halt? Danke+Gruß, Christoph |
Re: Doppelten Start eines Programmes verhindern
Zitat:
Zitat:
Mit "break;", "exit;" und "halt;" mancht man den Code schön unstrukiert... |
Re: Doppelten Start eines Programmes verhindern
Mir ist es gelungen, die Kausalität ausser Kraft zu setzen und das am roten Kasten vorbei (Antwort vor Frage). :mrgreen: Wie immer ist mein Ansatz der, Fehler zu vermeiden und nicht erst danach einzugreifen. Im konkreten Fall würde ich einfach eine Semaphore einsetzen. Versucht jemand das Programm nochmals zu starten, dann landet er genau da, wo er vorher auch war. Der Tip mit Mutex läuft ähnlich und ist wohl durch Internet mehr verbreitet worden, aber irgendwo gibt es einen wichtigen negativen Unterschied. Frag mich aber jetzt nicht, wo genau. Da die Semaphoren einwandfrei gehen, ist mir das auch egal. 8)
Uff, jetzt schlägt der Kasten doch zu. Es gibt 1000 Möglichkeiten seinen Source unstrukturiert zu machen. HALT gehört sicherlich dazu. |
Re: Doppelten Start eines Programmes verhindern
Sagen wirs mal so : wird das Programm beendet, dann ist der Speicher immer noch da. Angenommen, Du schreibst in Word einen Text und beim Rechner wird plötzlich Stecker gezogen. Was ist nun mit dem Text ? Ist der vielleicht sogar unrettbar weg ? :shock:
|
Re: Doppelten Start eines Programmes verhindern
Zitat:
Es ging mir um folgende konkrekte Frage: Eine Instanz eines Programmes läuft im Windows und erfreut sich bester Gesundheit. Jetzt startet der User eine 2. Instanz des Programmes. Wenn ich dabei das Mutex-Prinzip umsetze und z.B. in einer separaten Unit in das Projekt einbinde, dann wir das Programm beendet zwischen begin und Application.Initialize; - also bevor der Code zum initialisieren greift:
Delphi-Quellcode:
Okay ich gebe zu, das Initialization-Blöcke in anderen Units auch schon ausgeführt werden.
{$R *.res}
... begin // hier wird der Ablauf schon unterbrochen!! Application.Initialize; Application.Title := 'xxx'; Application.CreateForm(TMainForm, MainForm); Application.Run; end. Aber nun nochmal ganz genau: Welchen Nebeneffekt hat ein Halt; zu diesem Zeitpunkt des Programmstarts? Was kann z.B. Windows nicht tun, was es normalerweise tun muss, um den Prozess korrekt zu beenden? Gruß, Christoph |
Re: Doppelten Start eines Programmes verhindern
Es könnten z.B. schon Dateihandles offen sein. Wenn die nicht mehr freigegeben werden, kreigt sie niemand sonst (naja, kommt aufs Share-flag an)
|
Re: Doppelten Start eines Programmes verhindern
Nene, so war das nicht gemeint ! Mir ging es darum, ein Programm gar nicht erst zu starten, wenn es schon gestartet ist. 8) Mit Semaphoren geht das. Zumindest hier.
|
Re: Doppelten Start eines Programmes verhindern
Zitat:
naja egal :roll: also ich hab durch denn link von jürgen thomas einen beitrag von turboPASCAL gefunden... der hat ne beispiel anwendung mal gepostet in der demonstriert wurde wie man ein programm das bereits läuft und noch mals gestartet wird in den vordergrund holt... funktioniert einwandfrei, auch wenn das programm in denn tray minmiert wurde (ok es bleibt im tray, aber es wird nicht 2 mal gestartet wie zuvor) ich hab jetzt nur noch ein kleines problem mit dem text in der taskleiste... denn muss ich in der .dpr datei festhinterlegen, würde dies aber gerne variable machen!
Delphi-Quellcode:
program DPStart;
uses Forms, Windows, DPStart_main in 'DPStart_main.pas' {Main_Form}; {$R *.res} var FirstInstance : hWnd; begin FirstInstance := FindWindow('TApplication', 'hier muss ich denn text reinschreiben'); // <-- die stelle hätte ich gern variabel!!! If FirstInstance <> 0 Then Begin If IsIconic(FirstInstance) Then ShowWindow(FirstInstance, SW_RESTORE) Else SetForeGroundWindow(FirstInstance); FlashWindow(FirstInstance, True); End Else Begin Application.Title := 'hier muss ich denn text reinschreiben';´// <-- und diese auch Application.CreateForm(TMain_Form, Main_Form); Application.Run; End; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:21 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