Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi nonVCL Programm nur einmal starten (https://www.delphipraxis.net/24928-nonvcl-programm-nur-einmal-starten.html)

WeTec 28. Jun 2004 19:05


nonVCL Programm nur einmal starten
 
Tach.

ja ich weis. Das Problem mit dem 'Programm nur einmal starten' ist schon X-mal geklärt :wink: . Aber ich will es genauso mit einem nonVCL-Programm machen. Habe aber noch nix gefunden.

hat einer ne Idee?

WeTec

MathiasSimmack 28. Jun 2004 19:06

Re: nonVCL Programm nur einmal starten
 
Wenn du weißt, dass das Problem schon x-mal geklärt ist, warum übernimmst du es dann nicht für nonVCL? Ich tue das immer. Sprich: [dp]"Semaphore"[/dp].

SirThornberry 28. Jun 2004 19:08

Re: nonVCL Programm nur einmal starten
 
einfach die function nehmen die createmutex auruft
Delphi-Quellcode:
const
  kernel32 = 'kernel32.dll';
[...]
function _CreateMutex(lpMutexAttributes: PSecurityAttributes;
  bInitialOwner: Integer; lpName: PChar): THandle; stdcall; external kernel32 name 'CreateMutexA';

MathiasSimmack 28. Jun 2004 19:09

Re: nonVCL Programm nur einmal starten
 
Was soll das denn? "CreateMutex" bzw. "CreateSemaphore" sind Teil der Windows-Unit. Und die gehört IMHO in ein vernünftiges nonVCL-Programm. Ansonsten musst du sehr viel selbst machen.

Man kann´s mit dem Vermeiden von Units auch übertreiben. :roll:

SirThornberry 28. Jun 2004 19:15

Re: nonVCL Programm nur einmal starten
 
@MathiasSimmack: Ich bin einfach davon ausgegangen das er möglichst wenig/keine weiteren units einbinden will. Aber hast schon recht, die konstanten etc. aus der windowsunit braucht man ja auch außer mann will die auch alle selbst definieren bzw. die Datentypen und records

WeTec 28. Jun 2004 19:27

Re: nonVCL Programm nur einmal starten
 
tja, alles schön und gut aber wo soll ich das hinschreiben?
bei mir gibts nur eine function dlgfunc(hwnd: ... und initialization will er irgendwie nicht so richtig verstehen.

seid mir nicht böse aber ich fang gerade erst an mit nonVCL.

ps: was ist eigentlich "CreateMutex" bzw. "CreateSemaphore"??

tommie-lie 28. Jun 2004 20:10

Re: nonVCL Programm nur einmal starten
 
Zitat:

Zitat von WeTec
tja, alles schön und gut aber wo soll ich das hinschreiben?
bei mir gibts nur eine function dlgfunc(hwnd: ... und initialization will er irgendwie nicht so richtig verstehen.

Na, da wo du's in einer VCL-Anwendung auch hinmachst, in die Projektdatei gleich hinter begin. Die müsstest du ja sowieso bearbeitet haben, wenn du eine nonVCL-Anwendung hast, und bevor du dort dein Fenster registrierst, guckst du, ob eine andere Instanz da ist. Den Code findet man ja über Mathias' Link.

Zitat:

Zitat von WeTec
ps: was ist eigentlich "CreateMutex" bzw. "CreateSemaphore"??

Zwei Funktionen :mrgreen:
Ein Mutex und ein Semaphore sind Kernelobjekte und für die Multithreadsynchronization gedacht, also damit sich ein Thread nicht mit einem anderen ins Gehege kommt, was gemeinsam genutzte Variablen angeht. Ein Mutex kann dabei 2 Werte haben, "signaled" und "unsignaled", also nur zwei Stati. Ein Semaphore kann hingegen Werte zwischen 0 und einem angegebenem Maximum annehmen, erlaubt also mehreren Threads den Zugriff auf eine beschränkte Anzahl an Ressourcen.
Um nur ein Programm zu starten benutzt man einen Semaphore, um die Ressource (Prozessor) auf einen Thread zu begrenzen. Dabei bekommt der Semaphore einen Namen zugewiesen, versucht eine zweite Instanz des Programmes diesen Namen zu öffnen, gibt's 'nen Fehler, weil der Semaphore schon existiert, diesen Fehler fängt man ab und beendet sich selbst, wenn er auftritt. Die erste Instanz kann den Semaphore ohne Probleme erzeugen, die zweite stellt fest, daß ein Semaphore mit diesem Namen bereits existier und beendet sich wieder.

MathiasSimmack 28. Jun 2004 20:26

Re: nonVCL Programm nur einmal starten
 
Zitat:

Zitat von tommie-lie
Zitat:

Zitat von WeTec
tja, alles schön und gut aber wo soll ich das hinschreiben?
bei mir gibts nur eine function dlgfunc(hwnd: ... und initialization will er irgendwie nicht so richtig verstehen.

Na, da wo du's in einer VCL-Anwendung auch hinmachst, in die Projektdatei gleich hinter begin.

Nicht zwangsläufig. Es gibt auch fertige Units von anderen Entwicklern, die man lediglich einbinden muss. Die benutzen zwar grundsätzlich den gleichen Code, verwenden den aber im initialization/finalization-Teil. Hat WeTec ja auch angedeutet. Da kommt´s dann noch auf die Reihenfolge an, damit diese Unit auch als erste abgearbeitet wird.
Und genau darum schreibe ich mir die paar Zeilen Code auch lieber selbst in die Projektdatei. ;)

@WeTec: Du redest von der Dialogfunktion, die deine Nachrichten bearbeitet. Aber in deinem Programm wird der Dialog auch noch erzeugt. Entweder über "CreateDialog" oder "DialogBox". Und davor erzeugst du den Mutex/Semaphore, prüfst ob er ggf. schon existiert. Und danach gibst du den Mutex/Semaphore wieder frei.

tommie-lie 28. Jun 2004 20:42

Re: nonVCL Programm nur einmal starten
 
Zitat:

Zitat von MathiasSimmack
Nicht zwangsläufig. Es gibt auch fertige Units von anderen Entwicklern, die man lediglich einbinden muss. Die benutzen zwar grundsätzlich den gleichen Code, verwenden den aber im initialization/finalization-Teil. Hat WeTec ja auch angedeutet. Da kommt´s dann noch auf die Reihenfolge an, damit diese Unit auch als erste abgearbeitet wird.
Und genau darum schreibe ich mir die paar Zeilen Code auch lieber selbst in die Projektdatei. ;)

So einen Aufwand würde ich dafür nichtmal machen...
Und da es wirklich nur 'ne Handvoll Zeilen sind, tippe ich das schneller, als ich die Unit suche und korrekt einbinde. Und was ich im DF oder der DP mal im vorbeischauen gesehen habe, spielte sich auch immer in der Projektdatei ab und nicht in irgendwelchen initialization-Abschnitten von Units. So um die Ecke kann ich gar nicht denken :mrgreen:

MathiasSimmack 28. Jun 2004 20:46

Re: nonVCL Programm nur einmal starten
 
Ja, is´ ja auch meine Rede. ;) Aber ich zitiere mal:
Zitat:

Zitat von WeTec
tja, alles schön und gut aber wo soll ich das hinschreiben?
bei mir gibts nur eine function dlgfunc(hwnd: ... und initialization will er irgendwie nicht so richtig verstehen.



Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz