Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Doppelten Start eines Programmes verhindern (https://www.delphipraxis.net/79630-doppelten-start-eines-programmes-verhindern.html)

Hansa 25. Okt 2006 20:43

Re: Doppelten Start eines Programmes verhindern
 
Zitat:

Zitat von pertzschc
Was aber gefällt Dir an dem Halt; nicht?

Ganz einfach : beim Programmstart wird eventuell eine Menge initialisiert, Dateien geöffnet usw. Und Du gehst jetzt hin und sagst lapidar : egal, nach mir die Sintflut. :mrgreen:

pertzschc 25. Okt 2006 20:43

Re: Doppelten Start eines Programmes verhindern
 
Zitat:

Zitat von xZise
Ich habe mich nicht damit auseinandergesetzt... Deshalb kann es sein, dass es so nicht geht, aber wenn es so geht, dann kann man so ein Halt; / Application.Terminate; umgehen!

Nochmal die Frage an Dich: Was ist so schlimm an einem Halt; bzw. was genau spricht an Argumenten gegen eine Benutzung?
Das Halt kommt ja noch vor einem Application.Initialize; (bei einer VCL-Anwendung)...

Gruß,
Christoph

pertzschc 25. Okt 2006 20:45

Re: Doppelten Start eines Programmes verhindern
 
Zitat:

Zitat von Hansa
Ganz einfach : beim Programmstart wird eventuell eine Menge initialisiert, Dateien geöffnet usw.

Meinst Du Dinge innerhalb der Delphi-Anwendung, sprich Forms per Autocreate oder Datamodule oder meinst Du Dinge, die Windows automatisch macht, worauf man im Code der Anwendung keinen Einfluss hat?

Wenn zweiteres, bitte erläutere doch mal genauer, was genau man da Windows zerschiessen könnte mit einem Halt?

Danke+Gruß,
Christoph

xZise 25. Okt 2006 20:54

Re: Doppelten Start eines Programmes verhindern
 
Zitat:

Zitat von pertzschc
Zitat:

Zitat von xZise
Ich habe mich nicht damit auseinandergesetzt... Deshalb kann es sein, dass es so nicht geht, aber wenn es so geht, dann kann man so ein Halt; / Application.Terminate; umgehen!

Nochmal die Frage an Dich: Was ist so schlimm an einem Halt; bzw. was genau spricht an Argumenten gegen eine Benutzung?
Das Halt kommt ja noch vor einem Application.Initialize; (bei einer VCL-Anwendung)...

Gruß,
Christoph

Sorry, aber ich habe nur einen Weg präsentiert, indem man das umgeht, und nie etwas direkt dazu gesagt...

Zitat:

Zitat von Hansa
P.S.: mir gefällt die Holzhammermethode mit dem halt; nicht! Das geht auch anders.

Aber wo wir gerade dabei sind :D ...
Mit "break;", "exit;" und "halt;" mancht man den Code schön unstrukiert...

Hansa 25. Okt 2006 21:00

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.

Hansa 25. Okt 2006 21:06

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:

pertzschc 25. Okt 2006 21:13

Re: Doppelten Start eines Programmes verhindern
 
Zitat:

Zitat von Hansa
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 ?

Den Vergleich verstehe ich nicht.

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:
{$R *.res}
...
begin
// hier wird der Ablauf schon unterbrochen!!
  Application.Initialize;
  Application.Title := 'xxx';
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
end.
Okay ich gebe zu, das Initialization-Blöcke in anderen Units auch schon ausgeführt werden.
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

DGL-luke 25. Okt 2006 21:52

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)

Hansa 25. Okt 2006 23:36

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.

Andidreas 26. Okt 2006 10:07

Re: Doppelten Start eines Programmes verhindern
 
Zitat:

Zitat von Luckie
Steht doch da: ShowMessage(...), istnur auskommentiert.

was isn das für ne antwort??? hast du meine frage überhaupt durchgelesen???

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.
Seite 2 von 3     12 3      

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